从 Flask 迁移#

由于 Quart 与 Flask 公共 API 兼容,因此从 Flask 迁移到 Quart 应该比较简单。 此迁移主要包括两个步骤,首先用 Quart 导入替换 Flask 导入,其次插入相关的 asyncawait 关键字。

导入更改#

来自 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

注意,除了 QuartFlask 类本身外,这两个包中导入的对象具有相同的名称。

这可以通过使用查找和替换在很大程度上实现自动化。

异步和等待#

由于 Quart 是一个基于 asyncio 的异步框架,因此有必要显式添加 asyncawait 关键字。 最值得注意的地方是在路由函数中,例如在 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 扩展 文档。