flask restful 入门

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

# This field will not be sent in the response
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 描述的转换。从对象中提取的唯一字段是 taskfields.Url 域是一个特殊的域,它接受端点(endpoint)名称作为参数并且在响应中为该端点生成一个 URL。许多你需要的字段类型都已经包含在内。请参阅 fields 指南获取一个完整的列表。


flask restful 入门
https://flepeng.github.io/021-Python-32-框架-Flask-flask-restful-flask-restful-入门/
作者
Lepeng
发布于
2021年3月31日
许可协议