Flask 学习-42.Flask-RESTX 快速入门
原创
©著作权归作者所有:来自51CTO博客作者上海悠悠的原创作品,请联系作者获取转载授权,否则将追究法律责任
前言
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-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'}