Flaskからの移行#

QuartはFlaskの公開APIと互換性があるため、FlaskからQuartへの移行は比較的簡単に行えるはずです。この移行は基本的に2つのステップで構成され、まずFlaskのインポートをQuartのインポートに置き換え、次に適切な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クラス自体を除いて、両方のパッケージで同じ名前を持っていることに注意してください。

これは、検索と置換を使用してほぼ自動化できます。

AsyncとAwait#

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を検索することで、awaitablesを検索できます。

次の一般的な行にはawaitが必要です。これらはasyncの関数/メソッドでawaitする必要があることに注意してください。非asyncの関数/メソッドでのawaitは構文エラーです。

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するためです。例:

await test_client.get('/')
await test_client.post('/')
await test_client.open('/', 'PUT')

拡張機能#

QuartでFlask拡張機能を使用するには、Flask拡張機能の使用ドキュメントを参照してください。