スタートアップとシャットダウン#

ASGI ライフスパン仕様 には、最初のバイトを受信する前と最後のバイトを送信した後に、コルーチンを待機する機能がstartupshutdownライフスパンイベントを通して含まれています。これは、接続プールの作成と破棄に特に役立ちます。Quart は、ジェネレータを返す関数を期待するデコレータbefore_serving()after_serving()、およびwhile_serving()を介してこれをサポートしています。

デコレートされた関数はすべてアプリコンテキスト内で呼び出されるため、current_appgを使用できます。

警告

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("/")
    ...