アプリケーションコンテキスト—フラスコのドキュメント

提供:Dev Guides
< FlaskFlask/docs/1.0.x/appcontext
移動先:案内検索

アプリケーションコンテキスト

アプリケーションコンテキストは、要求、CLIコマンド、またはその他のアクティビティ中にアプリケーションレベルのデータを追跡します。 アプリケーションを各関数に渡すのではなく、 current_app および g プロキシにアクセスします。

これは、リクエストコンテキストに似ており、リクエスト中にリクエストレベルのデータを追跡します。 リクエストコンテキストがプッシュされると、対応するアプリケーションコンテキストがプッシュされます。

コンテキストの目的

Flaskアプリケーションオブジェクトには、configなどの属性があり、ビュー内および CLIコマンド内でアクセスするのに役立ちます。 ただし、プロジェクトのモジュール内でappインスタンスをインポートすると、循環インポートの問題が発生する傾向があります。 アプリファクトリパターンを使用する場合、または再利用可能なブループリントまたは拡張機能を書き込む場合、インポートするappインスタンスはまったくありません。

Flaskは、アプリケーションコンテキストでこの問題を解決します。 appを直接参照するのではなく、 current_app プロキシを使用します。これは、現在のアクティビティを処理するアプリケーションを指します。

リクエストを処理するときに、Flaskはアプリケーションコンテキストを自動的にプッシュします。 ビュー関数、エラーハンドラー、およびリクエスト中に実行されるその他の関数は、 current_app にアクセスできます。

また、@app.cli.command()を使用してFlask.cliに登録されたCLIコマンドを実行すると、Flaskはアプリコンテキストを自動的にプッシュします。


コンテキストの存続期間

アプリケーションコンテキストは、必要に応じて作成および破棄されます。 Flaskアプリケーションがリクエストの処理を開始すると、アプリケーションコンテキストとリクエストコンテキストをプッシュします。 リクエストが終了すると、リクエストコンテキストがポップされ、次にアプリケーションコンテキストがポップされます。 通常、アプリケーションコンテキストの有効期間はリクエストと同じです。

コンテキストの動作とリクエストのライフサイクル全体の詳細については、リクエストコンテキストを参照してください。


コンテキストを手動でプッシュする

アプリケーションコンテキスト外で current_app またはそれを使用するものにアクセスしようとすると、次のエラーメッセージが表示されます。

RuntimeError: Working outside of application context.

This typically means that you attempted to use functionality that
needed to interface with the current application object in some way.
To solve this, set up an application context with app.app_context().

拡張機能の初期化時など、アプリケーションの構成中にそのエラーが表示された場合は、appに直接アクセスできるため、コンテキストを手動でプッシュできます。 withブロックでapp_context()を使用すると、ブロック内で実行されるすべてのものが current_app にアクセスできるようになります。

def create_app():
    app = Flask(__name__)

    with app.app_context():
        init_db()

    return app

アプリケーションの構成に関係のないコードのどこかにそのエラーが表示された場合は、そのコードをビュー関数またはCLIコマンドに移動する必要があることを示している可能性があります。


データの保存

アプリケーションコンテキストは、リクエストまたはCLIコマンド中に一般的なデータを保存するのに適した場所です。 Flaskは、この目的のために gオブジェクトを提供します。 これは、アプリケーションコンテキストと同じ存続期間を持つ単純な名前空間オブジェクトです。

ノート

gの名前は「グローバル」を表しますが、これはコンテキスト内でグローバルであるデータを指します。 gのデータは、コンテキストの終了後に失われるため、リクエスト間でデータを保存するのに適切な場所ではありません。 セッションまたはデータベースを使用して、リクエスト間でデータを保存します。


g の一般的な使用法は、リクエスト中にリソースを管理することです。

  1. get_X()は、リソースXが存在しない場合は作成し、g.Xとしてキャッシュします。
  2. teardown_X()は、リソースが存在する場合、リソースを閉じるか、割り当てを解除します。 teardown_appcontext()ハンドラーとして登録されています。

たとえば、次のパターンを使用してデータベース接続を管理できます。

from flask import g

def get_db():
    if 'db' not in g:
        g.db = connect_to_database()

    return g.db

@app.teardown_appcontext
def teardown_db():
    db = g.pop('db', None)

    if db is not None:
        db.close()

リクエスト中、get_db()を呼び出すたびに同じ接続が返され、リクエストの終了時に自動的に閉じられます。

LocalProxyを使用して、get_db()からローカルの新しいコンテキストを作成できます。

from werkzeug.local import LocalProxy
db = LocalProxy(get_db)

dbにアクセスすると、 current_app が機能するのと同じ方法で、get_dbが内部的に呼び出されます。



拡張機能を作成する場合は、 g をユーザーコード用に予約する必要があります。 内部データはコンテキスト自体に保存できますが、十分に一意の名前を使用してください。 現在のコンテキストには、 _app_ctx_stack.top でアクセスします。 詳細については、 Flask Extension Development を参照してください。


イベントとシグナル

アプリケーションは、アプリケーションコンテキストがポップされると、teardown_appcontext()に登録されている関数を呼び出します。

signal_available がtrueの場合、次のシグナルが送信されます: appcontext_pushedappcontext_tearing_down 、および appcontext_popped