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拡張機能の使用ドキュメントを参照してください。