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)

posted @ 2023-04-13 13:57  www.pu  Views(263)  Comments(0Edit  收藏  举报