flask restful 官方文档
简介
Flask-RESTful是用于快速构建REST API的Flask扩展。
安装
Flask-Restful需要在Flask 0.8以上的版本,在Python2.6或者Python3.3上运行。通过pip install flask-restful即可安装。
1
| $ pip install flask-restful
|
添加路由有两种方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| from flask import Flask from flask.ext import restful
app = Flask(__name__) api = restful.Api(app)
##### 第一种:装饰器方式 # @api.resource('/helloWord') class HelloWorld(restful.Resource): def get(self): return {'hello': 'world'}
##### 第二种 # 参数解析:第一:视图类;第二到第n个:通过多个 URLs 访问视图;最后一个:endpoint api.add_resource(HelloWorld, '/') api.add_resource(HelloWorld, '/', '/hello', endpoint='todo_ep')
|
蓝图的restful视图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| from flask import Flask,Blueprint from flask_restful import Api,Resource app = Flask(__name__)
# 创建蓝图 bp = Blueprint('bp_index',__name__)
# 把蓝图对象给Api接口 api = Api(bp)
# 定义视图类 class IndexResource(Resource): def get(self): return {'get':'hello restful'}
def post(self): return {'post':'hello restful'}
#蓝图注册 app.register_blueprint(bp) # api注册路由 api.add_resource(IndexResource,'/') if __name__ == '__main__': app.run()
|
注:当配置restful方式时,add_resource 参数的路由必须以 /
开始,否则会导致访问不到
装饰器在flask-restful的配置方法,csrf 等均可以在这里配置
1 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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| from flask import Flask from flask_restful import Api,Resource
app = Flask(__name__)
api = Api(app)
# 定义一个装饰器函数 def delecr(func): def wrapper(*args,**kwargs): print('装饰器1运行') rec = func(*args,**kwargs) print('装饰器1结束') return rec return wrapper
def delecr2(func): def wrapper(*args,**kwargs): print('装饰器2运行') rec = func(*args,**kwargs) print('装饰器2结束') return rec return wrapper
class IndexResource(Resource): method_decorators = { 'get': [delecr], 'post':[delecr2] }
def get(self): return {'get':'kevin'}
def post(self):
return {'post':'vack'}
api.add_resource(IndexResource,'/')
if __name__ == '__main__': app.run()
|
参数解析
尽管 Flask 能够简单地访问请求数据(比如查询字符串或者 POST 表单编码的数据),验证表单数据仍然很痛苦。Flask-RESTful 内置了支持验证请求数据,它使用了一个类似 argparse
的库。
1 2 3 4 5
| from flask.ext.restful import reqparse
parser = reqparse.RequestParser() parser.add_argument('rate', type=int, help='Rate to charge for this resource') args = parser.parse_args()
|
使用 reqparse
模块同样可以自由地提供聪明的错误信息。如果参数没有通过验证,Flask-RESTful 将会以一个 400 错误请求以及高亮的错误信息回应。
{'status': 400, 'message': 'foo cannot be converted to int'}
使用 strict=True
调用 parse_args
能够确保当请求包含你的解析器中未定义的参数的时候会抛出一个异常。
args = parser.parse_args(strict=True)
数据格式化
默认情况下,在你的返回迭代中所有字段将会原样呈现。尽管当你刚刚处理 Python 数据结构的时候,觉得这是一个伟大的工作,但是当实际处理它们的时候,会觉得十分沮丧和枯燥。为了解决这个问题,Flask-RESTful 提供了 fields
模块和 marshal_with()
装饰器。类似 Django ORM 和 WTForm,你可以使用 fields 模块来在你的响应中格式化结构。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| from collections import OrderedDict from flask.ext.restful import fields, marshal_with
resource_fields = { 'task': fields.String, 'uri': fields.Url('todo_ep') }
class TodoDao(object): def __init__(self, todo_id, task): self.todo_id = todo_id self.task = task
self.status = 'active'
class Todo(Resource): @marshal_with(resource_fields) def get(self, **kwargs): return TodoDao(todo_id='my_todo', task='Remember the milk')
|
上面的例子接受一个 python 对象并准备将其序列化。marshal_with()
装饰器将会应用到由 resource_fields
描述的转换。从对象中提取的唯一字段是 task
。fields.Url
域是一个特殊的域,它接受端点(endpoint)名称作为参数并且在响应中为该端点生成一个 URL。许多你需要的字段类型都已经包含在内。请参阅 fields
指南获取一个完整的列表。