flask_restx
安装和官网
pip install flask-restx
Flask-RESTX requires Python version 2.7, 3.5, 3.6, 3.7, or 3.8. It’s also working with PyPy and PyPy3.
官方文档: https://flask-restx.readthedocs.io/en/latest/index.html
基本使用使用的两种方式
方式一:
from flask import Flask
from flask_restx import Api
app = Flask(__name__)
api = Api(app)
方式二:
from flask import Flask
from flask_restx import Api
api = Api()
app = Flask(__name__)
api.init_app(app)
配合名称空间使用方式
from flask import Flask
from flask_restx import Resource, Api, Namespace
app = Flask(__name__)
api = Api(app,
version='1.0',
title='Sample API',
description='A sample API',
# doc='/doc' # swagger地址,默认'/', 支持自定义
)
# 定义命名空间
demo = Namespace(name="demo", description='demo学习')
case = Namespace(name="case", description='case练习')
# 添加命名空间,并指定空间路径
api.add_namespace(demo, '/demo')
api.add_namespace(case, '/case')
# @api.route('/case') # 原生路由
# 定义子路由,如果没有的话,传空字符串即可,默认是/Case
@case.route("") # 路由由原来的api,变成命名空间的路由
class Case(Resource):
# 定义restful 风格的方法
def get(self):
return {'code': 0, 'msg': 'get success'}
def post(self):
return {'code': 0, 'msg': 'post success'}
def put(self):
return {'code': 0, 'msg': 'put success'}
def delete(self):
return {'code': 0, 'msg': 'delete success'}
# @api.route('/demo') # 原生路由
@demo.route("")
class Demo(Resource):
# 定义restful 风格的方法
def get(self):
return {'code': 0, 'msg': 'get success'}
def post(self):
return {'code': 0, 'msg': 'post success'}
def put(self):
return {'code': 0, 'msg': 'put success'}
def delete(self):
return {'code': 0, 'msg': 'delete success'}
if __name__ == '__main__':
app.run(debug=True)
结合蓝图使用
参考:https://www.likecs.com/show-308340760.html
swagger 参数配置两种方式
方法一:
使用@api.doc()或者@namespace.doc()装饰请求方法 (了解)
from flask import Flask
from flask_restx import Resource, Api, Namespace, fields
app = Flask(__name__)
api = Api(app,
version='1.0',
title='Sample API',
description='A sample API',
# doc='/doc' # swagger地址,默认'/', 支持自定义
)
# 定义命名空间
demo = Namespace("demo", description='demo学习')
@demo.route("")
class Demo(Resource):
# 传递参数
@demo.doc(params={'id': 'ID'})
def get(self):
return {'code': 0, 'msg': 'get success'}
# 定义body数据
# description描述信息
# required约束是否为必填项
# enum 枚举型,只允许在给定的值里选择,限制不是很强,选C也可以请求成功
# int类型,min属性指定最小值
post_model = api.model('PostModel',
{'name': fields.String(description='The name', required=True),
'type': fields.String(description='The object type', enum=['A', 'B']), #
'age': fields.Integer(min=0),
}
)
@demo.doc(body=post_model)
def post(self):
return {'code': 0, 'msg': 'post success'}
方式二:(推荐)
使用parser = api.parser()配合@api.expect(parser)或者@namespace.expect(parser)装饰器实现入参的校验和传入
方法二当请求参数类型不匹配或出现其他问题时,会有明显的提示,比方法一更直观
import json
import werkzeug
from flask import Flask, request
from flask_restx import Resource, Api, Namespace
app = Flask(__name__)
# 自定义版本号
api = Api(app,
version='1.0',
title='Sample API',
description='A sample API',
# doc='/doc' # swagger地址,默认'/', 支持自定义
)
case = Namespace("case", description='case练习')
api.add_namespace(case, '/case')
@case.route("")
class Case(Resource):
# 定义parser解析器对象
get_parser = api.parser()
get_parser.add_argument(name='id',type=int, location='args', required=True, default=1)
get_parser.add_argument(name='name', type=str, location='args')
@api.expect(get_parser)
def get(self):
print(f'request.args ==>{request.args}')
print(f'request.args ==>{request.args.get("id")}')
print(f'request.args ==>{request.args.get("name")}')
return {'code': 0, 'msg': 'get success'}
# 定义parser解析器对象,添加参数
post_parser = api.parser()
# name: 参数名,必填
# type: # 参数类型(int/bool/float/string/FileStorage/list),默认str, 只有location='json'时才能用type=list
# required: True/False
# location: args/form/json/files, args只能出现在querystring中,一般来说get请求用args, 处理post请求,一般来说用json,files,form.
# choices: 枚举,如: choices=("1", "2"), choice枚举类型的location=‘args’
# action='append', 多个value, 如 爱好
# action='split' # 多个value,如 爱好
post_parser.add_argument('id', type=int, location='json', required=True) # json格式和file格式不能同时存在,也不能和form格式同时存在
post_parser.add_argument('name', type=str, location='json', required=True)
# post_parser.add_argument('username', type=str, help='用户名', location='form', required=True)
# post_parser.add_argument('password', type=int, help='密码', location='form', default='123456')
# post_parser.add_argument('file', type=werkzeug.datastructures.FileStorage, location='files') # 须导入werkzeug
post_parser.add_argument('choice', choices=("1", "2"), location='args')
post_parser.add_argument('hobby', action='append') # 多个value,如 爱好
post_parser.add_argument('hobby', action='split') # 多个value,如 爱好
post_parser.add_argument('Header-args', location='headers') # 自定义header参数
# post_parser.add_argument('session_id', location='cookies')
@api.expect(post_parser)
def post(self):
print(f"request.content_type ==>{request.content_type}")
print(f"request.base_url ==>{request.base_url}")
print(f"request.url ==>{request.url}")
print(f"request.data ==>{json.loads(request.data)}")
print(f"request.args ==>{request.args}")
print(f"request.json ==>{request.args}")
print(f"request.form ==>{request.form}")
print(f"request.files ==>{request.files}")
return {'code': 0, 'msg': 'post success'}
if __name__ == '__main__':
app.run(debug=True)