デザインコンセプトの背後にあるフラスコは、コードが実行されるときに、2つの異なる「状態」が存在しています。アプリケーション層のモジュールで暗黙的に設定状態。これは、開始 Flask
オブジェクトがインスタンス化され、そして最初の着信要求は、暗黙のうちに終了したとき。この状態では、以下の仮定を適用する場合:
- アプリケーションプログラマは、安全にオブジェクトを変更します。
- 任意の処理前には要求が発生しません。
- あなたは魔法があなたがアプリケーションオブジェクトを作成または変更されているプロキシを与えないことができ、それを修正するために、オブジェクトへの参照を使用する必要があります。
対照的に、要求処理時。他のルールが存在します。
- ローカルコンテキストオブジェクト(とき要求がアクティブであるとき
flask.request
および他の)現在の要求を指します。 - 任意のコードが使用するために、いつでもこれらのオブジェクトを見つけることができます。
三番目のケースがあり、少し異なっています。時には、あなたが扱ったときに活動が同様の要求を要求しなかった場合でも、アプリケーションと対話することです。あなたが対話的なPythonシェルは、アプリケーション、またはコマンドラインアプリケーションの場合と対話する使用状況を想像してみてください。
current_app
ローカル変数のコンテキストは、コンテキスト駆動型アプリケーションです。
目的のアプリケーションコンテキスト
柱フラスコのデザインの一つは、あなたがPythonのプロセスで複数のアプリケーションを持つことができるということであるので、主な理由は、アプリケーションのコンテキストが存在することを、過去に、要求のコンテキストで機能の束を付けるには良い方法はありません。
そして、コードがどのように「右」アプリケーションを見つけるには?過去には、我々は、明示的にアプリケーションの周りに渡さお勧めしますが、彼らはライブラリがあまりにも不便なこのアイデアを実現できるようにするため、これは、ライブラリーの設計のこの考え方に問題が発生することはありません。
一般的な方法は、上記の問題を使用して後述する解決することである current_app
薬剤を、それが現在の要求を参照するアプリケーションに制限されています。いずれの場合においても、このような要求コンテキストのコストのかかる操作を作成するための要求、アプリケーションコンテキストのその後の導入の非存在下では必要ではありません。
アプリケーション・コンテキストを作成します。
アプリケーション・コンテキストを作成するには、2つの方法があります。最初は、暗黙的な方法である:リクエストコンテキストをスタックにプッシュされたときに、これが必要な場合、アプリケーション・コンテキストは、並んで作成されます。あなたがそれを必要としない限り、このため結果が、あなたは、アプリケーションのコンテキストの存在を無視することができます。
第二の方法は、明示的に使用することです app_context()
方法を:
フラスコインポートフラスコ、CURRENT_APPのアプリ= フラスコ(__name__ )とアプリ。app_context ():このブロック内の#、アプリへCURRENT_APPポイント。印刷CURRENT_APP 。名
場合は SERVER_NAME
設定され、それはまた、アプリケーションのコンテキストで使用することができます url_for()
機能。これはまた、あなたも、要求が存在しない状態でURLを生成することができます。
アプリケーションコンテキストのローカル変数
アプリケーションコンテキストが作成され、オンデマンドで破壊されます。これは、スレッド間で移動することはない、とのリクエスト間で共有されることはありません。だから、それはデータベース接続情報、または何か他のものを保存するのに最適な場所です。内部スタックオブジェクトが呼び出されます flask._app_ctx_stack
。拡張子は、前提が一意の名前を使用することで、無料のストレージ情報のスタックの最上部に逆転させることができる flask.g
オブジェクトがユーザーコードのために予約されています。
これに関する詳細については、 フラスコの拡張機能の開発を。
アプリケーションコンテキストの使用
アプリケーションコンテキストは通常、要求または要求の使用に前に作成されたものを下のリソースをキャッシュするために使用されています。例えば、データベース接続は、アプリケーション・コンテキストを使用するように運命づけられています。物事を格納するとき、それは場所のフラスコアプリケーションと拡張の間で共有されているため、アプリケーション・コンテキストは、固有の名前を選択する必要があります。
最も一般的な用途は、経営資源にある二つの部分に分かれています。
- リソース暗黙のキャッシュコンテキスト。
- 破壊のリソースベースのリリースの文脈。
一般に、get_X()
関数は、リソースを作成するために使用され X
た場合、 X
それ以外の場合は、の非存在下で同じリソースを戻すであろう teardown_X()
破壊プロセッサとして登録機能。
これは、データベースへの接続の一例です。
インポートsqlite3の
からフラスコインポートグラムデフget_db ():DB = GETATTR (G 、'_database' 、なし)場合、DBはありませんなし:DB = G 。_database = connect_to_database ()戻りDB app.teardown_appcontext @ DEF teardown_db (例外):DB = GETATTR (G 、'_database' 、なし)場合、DBはありませんませんなし:デシベル。近いです()
最初の呼び出しは get_db()
、接続が確立されます。確立プロセスは、暗黙的に使用しています LocalProxy
クラス:
werkzeug.local インポートLocalProxy DB = LocalProxy (get_db )
このように、ユーザーがすることができ get_db()
、直接にアクセスします db
。