flask使⽤restful接⼝风格之-flask-restx的使⽤
简介
flask-restx是⼀个⽀持RESTFul的flask插件。
⽤于规范化接⼝的编写,并且⽀持 swagger⽂档。
使⽤说明
下载
pip install flask-restx
⽰例代码
⽰例代码以⼀个使⽤蓝图的程序为例。其他⼩的应⽤可参看
项⽬结构
.
├── config.py
├── log
├── manage.py  # 启动⼊⼝
├── server
│├── __init__.py
│├── api.py
│├── apis
││└── test
││├── api.py
││└── web.py
│├── static
│└── templates
└── utils
└── db.py
实践代码:
# server  __init__.py
from flask import Flask
def create_app():
# 创建Flask对象
app = Flask(__name__)
# 注册蓝图
from server.api import api_v1
return app
# server api.py
from flask import Blueprint
from flask_restx import Api
from st.web import ns as test_ns
api_v1 = Blueprint('api1', __name__, url_prefix='/api')
api = Api(
api_v1,
version='1.0',
title='test flask',
description='test flask'
)
api.add_namespace(test_ns)
# server apis test web.py
import json
from flask import request, render_template, make_response, jsonify
from flask_restx import Namespace, Resource, fields
ns = Namespace('test', description='test')
restful接口详解
@ns.route("", strict_slashes=False)  # 实际访问地址 /api/test/
class TestHandler(Resource):
def get(self):
# 如果使⽤模板的块,需要使⽤ make_response
# return make_response(render_template('index.html', data=res), 200)
# 使⽤ jsonify 是为了返回json数据的同时,相⽐于 json.dumps() 其会⾃动修改 content-type 为 application/json        # 另外,如果使⽤ jsonify()的同时,还想⾃定义返回状态码,可以使⽤ make_response(jsonify(data=data), 201)        return jsonify()
def post(self):
pass
def put(self):
pass
def delete(self):
pass
代码说明
使⽤ flask-restx之后,可以使⽤类视图的⽅式定义接⼝.
可以访问 localhost:5000/api访问 swagger接⼝⽂档页⾯。
接⼝⽂档可以在编写代码的地⽅⼀起定义。
swagger⽂档编写⽅式
以上⾯ TestHandler类⽅法为基础,定义以下较为常⽤的⽂档。
通常情况下,restful接⼝默认返回的都是json数据。因此以下⽂档针对json数据。
所有定义⽂档都可以在浏览器访问 /api/ 查看
对于前后端不分离的 templates 等模板⽂档,可能有不正确的地⽅。
1. 参数以url形式
@ns.route("/<id>", strict_slashes=False)  # 实际访问地址 /api/test/1
@ns.doc(params={'id': 'An ID'})
class TestHandler(Resource):
def get(self, id):
return jsonify()
@ns.doc(response={403: 'Not Authorized'})
def post(self, id):
pass
2. 参数以json body的形式
parent = ns.model('Parent', {
'name': fields.String,
'age': fields.Integer(discriminator=True),
'addr': fields.String(description='地址'),
'gender': fields.String(description='性别', required=True, enum=['男', '⼥', '未知'])
})
child = ns.inherit('Child', parent, {
'extra': fields.String
})
@ns.route("/test3", strict_slashes=False)  # /api/test/test3
class Test2Handler(Resource):
@ns.marshal_with(child, as_list=True)  # 等价于 @api.marshal_list_with(resource_fields)    def get(self):
return "返回⼀个对象"
@ns.marshal_with(child, code=201)  # 201 代表创建成功
def post(self):
return '创建⼀个对象成功', 201
3. 其他
flask-restx提供了许多⽂档定制功能。每个功能都有不同的写法。如:
某个请求默认需要某些参数,并且要验证 ===>@ns.expect(resource_fields, validate=True)给已知响应定义默认响应-- @ns.response()
url路径⽂档===》@ns.route('', doc='') 或者 @ns.doc()
可使⽤多个 @ns.route() 装饰⼀个函数,使得多个url定位到⼀个Handler处理
给参数定义⽂档。如上⽂的json body 形式中的parent
给method定义⽂档
定义 headers定义⽂档
隐藏某些⽂档
⽂档授权
其他
具体⽂档可点了解
RESTful接⼝风格说明
具体说明可参看
坑点:此接⼝风格对批量处理的⽀持并不友好。解决此问题可参看

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。