この記事では、まずFlask Contextsを紹介し、さらにFlaskの2つのコンテキスト、Application ContextとRequest Contextについて見ていくことにします。
Flask Context とは?
Flask は Context を使って、特定の変数を一時的にグローバルにアクセスできるようにします。
Flask では、Flask Views が request オブジェクトを引数にとらず、そのまま使えることにお気づきでしょうか?これは、リクエストオブジェクトがグローバルオブジェクトである場合にのみ可能なことなのでしょうか?
さて、答えはNoです。
もしリクエストオブジェクトをグローバルにした場合、Flaskはサーバーに同時にヒットしたリクエストを区別することができません。
しかし、そうではなく、Webサイトでは複数のリクエストを同時に処理します。
FlaskはContextを使って、特定の変数を特定のリクエストオブジェクトに対して一時的にグローバルにし、Viewsがその変数にアクセスして出力を返せるようにしているのです。
Flaskのコンテキストは2種類あります。
- アプリケーションコンテキスト
- リクエストコンテキスト
Flask のアプリケーションコンテキスト
アプリケーションコンテキストは、アプリケーションレベルのデータを追跡します。
したがって、これらはデータベース接続、設定などのようなアプリケーション全体に固有の値を格納します。
アプリケーションコンテキストは、current_appやg変数のようなオブジェクトを公開します(つまり、一時的にそれらをグローバルにします)。
1. current_app
current_app は、リクエストを処理するインスタンスを指します。
つまり、Flaskが動作しているアプリケーションに関連します。
2. g変数
gはGlobalの略で、リクエスト処理中にデータベースの詳細などのデータを一時的に保存するために使用されます。
current_appとg変数に値が設定されると、アプリケーション内のどのViewでもそれらを使用することができます。
Flaskは、特定のリクエストが来たときに自動的にアプリケーションコンテキストをプッシュ(アクティブ)し、リクエストが処理されるとそれを削除します。
この記事もチェック:FlaskのCookiesの設定、保存や取得等の使い方を分かりやすく解説する
Flask のリクエストコンテキスト
アプリケーションコンテキストと同様に、リクエストコンテキストはリクエストレベルのデータを追跡します。
したがって、これらは各リクエストに固有の値を格納します。
リクエストコンテキストは、リクエストやセッションのようなオブジェクトを公開します。
1. リクエスト
リクエストオブジェクトは、現在のウェブリクエストに関する情報を含んでいます。
リクエストコンテキストはリクエストを一時的にグローバルにし、すべてのViewが引数として受け取ることなく簡単にアクセスできるようにします。
注意: リクエストは現在のリクエストの情報のみを含んでいます。
新しいリクエストが来たとき、リクエストオブジェクトは現在の新しいリクエストに関する情報を保存し、以前の情報は削除されます。
2. セッション
セッションは辞書のようなオブジェクトで、リクエストオブジェクトとは異なり、リクエスト間で持続する情報を保存します。
また、Flask のセッションについては、近々私たちのウェブサイトで全く別の記事を掲載し、より良い情報を提供する予定です。
したがって、ひとたびリクエストコンテキストがアクティブになれば、アプリケーション内のどのViewも、それによって公開されたオブジェクト(リクエストとセッション)にアクセスすることができます。
アプリケーションコンテキストと同様に、Flask は特定のリクエストが来たときに自動的にリクエストコンテキストをプッシュ(またはアクティブ)し、リクエストが処理されるとそれを削除します。
Note: リクエストコンテキストがプッシュされると、アプリケーションコンテキストも自動的に作成されます(まだ存在しない場合)。
シェルでFlask Contextを手動でPushします。
Flask アプリケーションは、Application と request の Context を自動的に作成/プッシュします。
そのため、ビュー関数の中では Context を気にすることなく application や request が公開するすべてのオブジェクトにアクセスすることができます。
しかし、ビュー関数の外やPythonシェルでこれらのオブジェクトを使用しようとすると、以下のようになります。
from flask import Flask, request
request.method |
from flask import Flask, current_app
current_app.name |
というエラーが発生します。
アプリケーションコンテキストオブジェクトの場合も同様です。
from flask import Flask, current_app
app = Flask(__name__)
appli_context = app.app_context()
current_app.name |
from flask import Flask, request
app = Flask(__name__)
req = app.test_request_context()
req.request |
これは、アプリケーションとリクエストコンテキストがアクティブになっていないためです。
したがって、まずそれらを作成する必要があります。
ここでは、Flask Instanceのappenta_context()メソッドを使用して、アプリケーションコンテキストを作成します。
コードを実行します。
ここで
- Flaskのオブジェクトであるappを宣言します。
- We push/create a application context using app.app_context()
- current_app is now active and is linked to the _name_JP ファイル、すなわちthe _JP_main_JP ファイルそのものにリンクされています。
これでエラーはなくなりましたね。
同様に、Flask Instanceのtest_request_context()メソッドでリクエストコンテキストを作成します。
こちらも同様に
- Flaskのオブジェクトであるappを宣言します。
- app.tes_request_context()を使ってリクエストコンテキストをpush/createしている。
- リクエストオブジェクトがアクティブになり、ホストウェブサイト、つまり ” http://loalhost/ ” ファイル自体にリンクされます。
その結果、エラーのない適切な出力が得られます。
この記事もチェック:Flaskでcssや画像などの静的ファイルを出力する方法を解説する
まとめ
以上、みなさん! 以上、Flask の Contexts についてでした。
Flask はアプリケーションファイルの中で自動的にコンテキストを作成するので、あまり気にする必要はありません。