前言

Flask-restfull 是flask 框架开发接口的一个框架,Flask-RESTPlus 是Flask-restfull 升级版,可以生成swagger 在线文档了。
但是 Flask-RESTPlus 这个项目不再维护了,迁移到 Flask-RESTX 了。Flask-RESTX 与 Flask-RESTPlus 的 API 保持 100% 兼容。

环境安装

Flask-RESTX 目前最新版本0.5.1 (但是不支持最新的flask 2.2.2版本)
以下是可以用的匹配版本

Flask==2.0.1
flask-restx==0.5.1
Werkzeug==2.0.1

Flask-RESTX 官方地址​​https://flask-restx.readthedocs.io/en/latest/quickstart.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)

一个简单的hello world

一个最小的 Flask-RESTX API 如下所示:

from flask import Flask
from flask_restx import Resource, Api

app = Flask(__name__)
api = Api(app)

@api.route('/hello')
class HelloWorld(Resource):
def get(self):
return {'hello': 'world'}

if __name__ == '__main__':
app.run(debug=True)

启动服务后访问​​http://127.0.0.1:5000/hello​

Flask 学习-42.Flask-RESTX 快速入门_flask

资源丰富的路由

Flask-RESTX 提供的主要构建块是资源。资源建立在Flask 可插拔视图之上,让您只需在资源上定义方法即可轻松访问多种 HTTP 方法。
应用程序的基本 CRUD 资源如下所示:

from flask import Flask, request
from flask_restx import Resource, Api

app = Flask(__name__)
api = Api(app)

todos = {}

@api.route('/<string:todo_id>')
class TodoSimple(Resource):
def get(self, todo_id):
return {todo_id: todos[todo_id]}

def put(self, todo_id):
todos[todo_id] = request.form['data']
return {todo_id: todos[todo_id]}

if __name__ == '__main__':
app.run(debug=True)

可以使用curl 测试上面接口,当然也可以用其它工具

$ curl http://localhost:5000/todo1 -d "data=Remember the milk" -X PUT
{"todo1": "Remember the milk"}
$ curl http://localhost:5000/todo1
{"todo1": "Remember the milk"}
$ curl http://localhost:5000/todo2 -d "data=Change my brakepads" -X PUT
{"todo2": "Change my brakepads"}
$ curl http://localhost:5000/todo2
{"todo2": "Change my brakepads"}

Flask-RESTX 可以理解来自视图方法的多种返回值。与 Flask 类似,您可以返回任何可迭代对象并将其转换为响应,包括原始 Flask 响应对象。
Flask-RESTX 还支持使用多个返回值设置响应代码和响应头,如下所示:

class Todo1(Resource):
def get(self):
# Default to 200 OK
return {'task': 'Hello world'}

class Todo2(Resource):
def get(self):
# Set the response code to 201
return {'task': 'Hello world'}, 201

class Todo3(Resource):
def get(self):
# Set the response code to 201 and return custom headers
return {'task': 'Hello world'}, 201, {'Etag': 'some-opaque-string'}