初始化
与其他所有扩展一样,您可以使用应用程序对象对其进行初始化:
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)
一个最小的 API
一个最小的 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)
Resourceful Routing(资源路由)
Flask-RESTX 提供的主要构建块是资源。资源建立在Flask 可插入视图之上,只需在资源上定义方法,您就可以轻松访问多个 HTTP 方法。
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)
Flask-RESTX 理解来自视图方法的多种返回值。与 Flask 类似,您可以返回任何可迭代对象并将其转换为响应,包括原始 Flask 响应对象。Flask-RESTX 还支持使用多个返回值设置响应代码和响应头,如下所示:
@api.route('/todo1')
class Todo1(Resource):
def get(self):
return {'task': 'Hello world'}
@api.route('/todo2')
class Todo2(Resource):
def get(self):
return {'task': 'Hello world'}, 201
@api.route('/todo3')
class Todo3(Resource):
def get(self):
return {'task': 'Hello world'}, 201, {'Etag': 'some-opaque-string'}
谷歌浏览器抓包分析:
端点
很多时候,在一个 API 中,您的资源将有多个 URL。您可以将多个 URL 传递给对象上的add_resource()方法或route()装饰器Api。每一个都将路由到您的Resource:
api.add_resource(HelloWorld, '/hello', '/world')
@api.route('/hello', '/world')
class HelloWorld(Resource):
pass
您还可以将路径的一部分作为变量匹配到您的资源方法。
api.add_resource(Todo, '/todo/<int:todo_id>', endpoint='todo_ep')
@api.route('/todo/<int:todo_id>', endpoint='todo_ep')
class HelloWorld(Resource):
pass
注意: 如果请求与您的应用程序的任何端点都不匹配,Flask-RESTX 将返回 404 错误消息,并提供与请求的端点密切匹配的其他端点的建议。这可以通过在应用程序配置中设置RESTX_ERROR_404_HELP为禁用False。
|