从 Flask 迁移#
由于 Quart 与 Flask 公共 API 兼容,因此从 Flask 迁移到 Quart 应该比较简单。 此迁移主要包括两个步骤,首先用 Quart 导入替换 Flask 导入,其次插入相关的 async
和 await
关键字。
导入更改#
来自 flask 包的任何模块导入都可以更改为来自 quart 包中相同模块的导入。 例如,在 Flask 中,
from flask import Flask, g, request
from flask.helpers import make_response
在 Quart 中变为,
from quart import Quart, g, request
from quart.helpers import make_response
注意,除了 Quart
和 Flask
类本身外,这两个包中导入的对象具有相同的名称。
这可以通过使用查找和替换在很大程度上实现自动化。
异步和等待#
由于 Quart 是一个基于 asyncio 的异步框架,因此有必要显式添加 async
和 await
关键字。 最值得注意的地方是在路由函数中,例如在 Flask 中,
@app.route('/')
def route():
data = request.get_json()
return render_template_string("Hello {{name}}", name=data['name'])
在 Quart 中变为,
@app.route('/')
async def route():
data = await request.get_json()
return await render_template_string("Hello {{name}}", name=data['name'])
如果您有足够的测试覆盖率,则可以通过搜索 RuntimeWarning: coroutine 'XX' was never awaited
来搜索可等待对象。
以下常见行需要等待,请注意这些必须在异步函数/方法中等待。 在非异步函数/方法中等待是一个语法错误。
await request.data
await request.get_data()
await request.json
await request.get_json()
await request.form
await request.files
await render_template()
await render_template_string()
测试#
测试客户端也需要使用 async 和 await 关键字,主要用于等待测试请求,即
await test_client.get('/')
await test_client.post('/')
await test_client.open('/', 'PUT')
扩展#
要将 Flask 扩展与 Quart 一起使用,请参阅 使用 Flask 扩展 文档。