コンテキスト#
Quartは、Flaskと同様に、*アプリケーションコンテキスト*と*リクエストコンテキスト*の2つのコンテキストを持ちます。これらのコンテキストはどちらもリクエストごとに存在し、グローバルプロキシである`current_app`、`request`などを解決できるようにします。これらのコンテキストはタスクローカルであるため、`ensure_future`または`create_task`によってタスクが生成された場合は存在しないことに注意してください。
これらのコンテキストの設計原則は、すべてのルートで必要となる可能性が高いため、これらのオブジェクトを渡すのではなく、グローバルプロキシを介して利用できるようにすることです。これには欠点があり、特にグローバル変数に関連するすべての引数が挙げられます。したがって、スコープを分離するために、これらのプロキシはルート内でのみ使用することをお勧めします。
アプリケーションコンテキスト#
アプリケーションコンテキストは、リクエストに特に関連しない情報の参照ポイントです。これには、アプリ自体、グローバルオブジェクト`g`、アプリのみにバインドされた`url_adapter`が含まれます。コンテキストは、リクエストコンテキストによって暗黙的に作成および破棄されます。
リクエストコンテキスト#
リクエストコンテキストは、リクエストに関連する情報の参照ポイントです。これには、リクエスト自体、リクエストにバインドされた`url_adapter`、セッションが含まれます。リクエストごとに`handle_request()`メソッドによって作成および破棄されます。
WebSocketコンテキスト#
WebSocketコンテキストは、リクエストコンテキストに似ていますが、WebSocketリクエストのみに関連します。WebSocket接続ごとに`handle_websocket_request()`メソッドによって作成および破棄されます。
タスクとコンテキスト#
コンテキストはContextVarにバインドされ、既存のタスクから作成されたタスクにコピーされます。コンテキストを明示的にコピーするために、Quartはデコレータである`copy_current_request_context()`と`copy_current_websocket_context()`を提供しています。これらは次のように使用できます。
@app.route('/')
async def index():
@copy_current_request_context
async def background_task():
method = request.method
...
asyncio.ensure_future(background_task())
...
非同期ジェネレーターで`request`コンテキストを提供する必要がある場合は、ストリーミングレスポンスで説明されているように、`quart.helpers.stream_with_context()`デコレータを使用してください。
@app.route('/')
async def index():
@stream_with_context
async def async_generator():
async for data in request.body:
yield data
await consume_data(async_generator())
...
注意
これらのデコレータは、既存のコンテキスト内で使用する必要があるため、バックグラウンドタスクはネストされた関数として定義されます。