Flaskにおけるアプリケーションコンテキストとリクエストコンテキストを解説する

スポンサーリンク

この記事では、まず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 のリクエストコンテキスト

アプリケーションコンテキストと同様に、リクエストコンテキストはリクエストレベルのデータを追跡します。

したがって、これらは各リクエストに固有の値を格納します。

リクエストコンテキストは、リクエストやセッションのようなオブジェクトを公開します。

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()メソッドを使用して、アプリケーションコンテキストを作成します。

コードを実行します。

Error
Error

ここで

  • 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 ファイルそのものにリンクされています。
Error
Error

これでエラーはなくなりましたね。

同様に、Flask Instanceのtest_request_context()メソッドでリクエストコンテキストを作成します。

App Context
App Context

こちらも同様に

  • Flaskのオブジェクトであるappを宣言します。
  • app.tes_request_context()を使ってリクエストコンテキストをpush/createしている。
  • リクエストオブジェクトがアクティブになり、ホストウェブサイト、つまり ” http://loalhost/ ” ファイル自体にリンクされます。
Request
Request

その結果、エラーのない適切な出力が得られます。

まとめ

以上、みなさん! 以上、Flask の Contexts についてでした。

Flask はアプリケーションファイルの中で自動的にコンテキストを作成するので、あまり気にする必要はありません。

タイトルとURLをコピーしました