安装
pip install flask-restful
创建Resource
实现类(通常在App包下的apis.py
中)
from flask import jsonify
from flask_restful import Resource
# 类视图 :CBV class base view
# 视图函数 :FBV function base view
class HelloResource(Resource):
def get(self):
return jsonify({'msg': 'get请求'})
def post(self):
return jsonify({'msg': 'post请求'})
创建api
对象并注册路由
# 方式一:创建并初始化 exts.py
api = Api(app)
# 方式二:创建之后初始化,在初始化插件中 exts.py
api = Api()
api.init_app(app)
# 注册路由 urls.py
# urls.py 路由文件
from .apis import *
from .exts import api
api.add_resource(HelloResource, '/hello/')
# 注意在 __init__.py中需要导入urls.py,否则没有执行路由
from .urls import *
使用方法:
fields
进行定义marshal_with
进行使用特性
null
使用
定义字段输出fields
使用字典进行定义
常用都是基本类型:String
,Integer
# 字段格式化:定义返回给前端的数据格式
ret_fields = {
'status': fields.Integer,
'msg': fields.String,
# 'data': fields.String, # 不返回data字段
'like': fields.String(default='ball'), # 不定义默认值,默认值则为null
'like2': fields.String, # 默认值则为null
'data2': fields.String(attribute='data'), # 内部属性名为data,返回出去为data2,即使用是data值
}
定义好的格式通过装饰器进行使用
@marshal_with(需要返回的数据格式)
,return
返回字典就ok了
class UserResource(Resource):
@marshal_with(ret_fields)
def get(self):
return {
'status': 1,
'msg': 'ok',
'data': 'python'
}
级联数据,嵌套字典,Nested
user_fields = {
# 'id': fields.Integer,
'name': fields.String,
'age': fields.Integer,
}
ret_fields2 = {
'status': fields.Integer,
'msg': fields.String,
# User对象
'data': fields.Nested(user_fields)
}
嵌套列表
user_fields2 = {
# 'id': fields.Integer,
'name': fields.String,
'age': fields.Integer,
}
ret_fields3 = {
'status': fields.Integer,
'msg': fields.String,
# User对象
'data': fields.List(fields.Nested(user_fields2))
}
URL:连接字段
# 格式化字段
user_fields = {
'name': fields.String,
# 路径匹配,在add_resource中也需要设置endpoint='id'
'url': fields.Url(endpoint='id', absolute=True)
}
# 在add_resource中提供对应的endpoint
api.add_resource(UserResource, '/user/', endpoint='id')
可以不通过
request.form
或request.args
获取参数,而是通过reqparse.RequestParser
来解析
# 参数转换器
parser = reqparse.RequestParser()
parser.add_argument('name', type=str, required=True, help='name是必须的参数') # 必需参数
parser.add_argument('age', type=int, action='append') # 可以有多个age,为数组
parser.add_argument('key', type=str, location='cookies') # 可以有多个age,为数组
class User4Resource(Resource):
def get(self):
args = parser.parse_args()
name = args.get('name')
age = args.get('age')
key = args.get('key')
return {
'name': name,
'age': age,
'key': key
}