スタートアップとシャットダウン#
ASGI ライフスパン仕様 には、最初のバイトを受信する前と最後のバイトを送信した後に、コルーチンを待機する機能がstartupとshutdownライフスパンイベントを通して含まれています。これは、接続プールの作成と破棄に特に役立ちます。Quart は、ジェネレータを返す関数を期待するデコレータbefore_serving()、after_serving()、およびwhile_serving()を介してこれをサポートしています。
デコレートされた関数はすべてアプリコンテキスト内で呼び出されるため、current_appとgを使用できます。
警告
gは、スタートアップ後(つまり、すべてのbefore_serving関数が完了した後、およびwhile servingジェネレータの最初のyieldの後)にリセットされるため、注意して使用してください。このコンテキスト内では引き続き使用できます。ルートで使用される何かを作成する場合は、代わりにアプリに格納してみてください。
この機能を使用するには、次の手順を実行します。
@app.before_serving
async def create_db_pool():
app.db_pool = await ...
g.something = something
@app.before_serving
async def use_g():
g.something.do_something()
@app.while_serving
async def lifespan():
... # startup
yield
... # shutdown
@app.route("/")
async def index():
app.db_pool.execute(...)
# g.something is not available here
@app.after_serving
async def create_db_pool():
await app.db_pool.close()
テスト#
Quart のテストクライアントはリクエストライフスパンで動作するため、before_serving関数またはafter_serving関数を呼び出さず、while_servingジェネレータを進めません。代わりに、Quart のテストアプリを使用できます。例:
@pytest.fixture(name="app", scope="function")
async def _app():
app = create_app() # Initialize app
async with app.test_app() as test_app:
yield test_app
before_serving関数とafter_serving関数が呼び出され、while_servingジェネレータが実行されたことを知って、アプリフィクスチャを通常どおり使用できます。
async def test_index(app):
test_client = app.test_client()
await test_client.get("/")
...