在使用 Flask 开发 web 接口时,设计到简单 RESTful 风格接口,使用 Restless 插件会非常方便,只需要几行代码就可以搞定一个服务器接口
下载
| 1 | $ pip install Flask-Restless | 
快速开始
编辑 run.py1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: wxnacy(wxnacy@gmail.com)
# Description:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_restless import APIManager
app = Flask(__name__)
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:wxnacy@127.0.0.1:3306/study?charset=utf8mb4'
app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI
db = SQLAlchemy(app)
manager = APIManager(app, flask_sqlalchemy_db=db)
class Book(db.Model):
    __tablename__ = 'book'
    id = db.Column(db.BIGINT, primary_key=True)
    name = db.Column(db.String, default="", doc='名称')
manager.create_api(Book, methods=['GET', 'POST', 'PUT', 'DELETE'])
app.run()
启动1
$ python run.py
POST
创建1
$ curl -X POST localhost:5000/api/book -H "Content-Type:application/json" -d '{"name":"wxnacy"}'
| 1 | { | 
GET
查看列表1
curl localhost:5000/api/book
| 1 | { | 
查看单个1
$ curl localhost:5000/api/book/96
| 1 | { | 
PUT
| 1 | $ curl -X PUT localhost:5000/api/book/96 -H "Content-Type:application/json" -d '{"name":"new_name"}' | 
| 1 | { | 
DELETE
| 1 | $ curl -X DELETE localhost:5000/api/book/96 | 
看,几行代码就搞定了增删改查四大功能,如果你只是搭个自己的小服务,这就已经足够了,再也不用吭哧吭哧写代码了,关于 Methods 的更多解释见文档
修改地址前缀
| 1 | manager.create_api(Book, url_prefix='/api/v2', methods=['GET']) | 
在 create_api 的时候作如上改动,就可以修改接口前缀1
$ curl localhost:5000/api/v2/book
搜索请求
Restless 非常强大的功能是,他可以在不改动代码的情况下做基于数据的条件查询1
2
3
4
5curl \
    -G \
    -H "Content-type: application/json" \
    -d "q={\"filters\":[{\"name\":\"name\",\"op\":\"like\",\"val\":\"%new%\"}]}" \
    http://127.0.0.1:5000/api/book
| 1 | { | 
什么代码都没动,就完成 like 的查询的操作,妈妈再也不用担心我写 API 了
请求格式
| 1 | {"name": <fieldname>, "op": <operatorname>, "val": <argument>} | 
或1
{"name": <fieldname>, "op": <operatorname>, "field": <fieldname>}
fieldname 是字段名,operatorname 是查询条件,argument 是条件值,通过不同的 op 值来完成相应操作,更多的 Operators 值
- ==, 371032668@qq.com, equals, equals_to
- !=, neq, does_not_equal, not_equal_to
- >, gt, <, lt
- >=, ge, gte, geq, <=, le, lte, leq
- in, not_in
- is_null, is_not_null
- like
- has
- any
 更多用法见文档
方法求值
Restless 另一个比较牛逼的功能,是可以使用数据库的函数,比如1
2
3$ curl localhost:5000/api/eval/book?q={"functions": [{"name": "count", "field": "id"}]}
# urlencode 编码后请求
$ curl localhost:5000/api/eval/book?q=%7B%22functions%22%3A%20%5B%7B%22name%22%3A%20%22count%22%2C%20%22field%22%3A%20%22id%22%7D%5D%7D
| 1 | {"count__id": 94} | 
就这样,我们得到了数据总和,不过这个功能默认是不打开的,需要设置 allow_functions 手动打开1
manager.create_api(Book, allow_functions=True, methods=['GET', 'POST', 'PUT', 'DELETE'])
更多介绍见文档
JSONP
Restless 默认支持 JSONP,使用正常访问方式即可1
$ curl localhost:5000/api/book/10?callback=foo
| 1 | foo({"data": {"id": 10, "name": "wxnacy"}, "meta": {"Content-Type": "application/javascript", "status": 200}}) | 
参考
 
             
		 
                      