Python

Flaskのアプリケーションコンテキストとは何なのか?

こんにちは、フルスタックエンジニアのryuです。

今回の記事では、Flaskのアプリケーションコンテキストとは何かについて解説します。 コンテキスト(Context)とは、英語で背景、状況、場面、文脈を意味する言葉です。Flaskやほかのプログラミング言語でも使われる言葉です。

アプリケーションコンテキストどのような意味があるのか、具体的なコードを交えて詳しく解説します。

関連【おすすめ】コマンドを打ちながらLinuxが学べるサイトInfraAcademy

サーバー構築を実践で身につけるInfraAcademy

※本ページには、プロモーション・アフィリエイトリンクが含まれています

Flaskのアプリケーションコンテキストとは何なのか?

Flaskには、「アプリケーションコンテキスト」と「リクエストコンテキスト」という2種類のコンテキスト があります。

これらを理解するためには、そもそもコンテキストというのがどのような意味があるのかについて解説します。

そもそもコンテキストとは?

コンテキストとは、特定の操作や処理を実行するために必要な情報や環境を提供する枠組みのことを指します。

具体的には、コンテキストは、実行中のコードがアクセスするための設定や状態のことです。例えば、メール送信やデータベース操作は、Flaskアプリケーションの設定や接続情報に依存しています。これらの情報を操作する枠組みがコンテキストです。

コンテキストをコードで見る

以下に簡単なFlaskのコードを記述します。

この例では、current_appを使用してアプリケーションの設定にアクセスしています。

from flask import Flask, current_app

app = Flask(__name__)
app.config['DEBUG'] = True

def do_something():
    # アプリケーションコンテキスト内でのみcurrent_appにアクセス可能
    print(current_app.config['DEBUG'])

@app.route('/')
def index():
    do_something()
    return "Hello, World!"

if __name__ == "__main__":
    with app.app_context():  # アプリケーションコンテキストを作成
        do_something()  # ここではcurrent_appにアクセス可能
    app.run()

こちらのコードをさらに詳しく解説します。

まずは、先頭の1~4行目です。

from flask import Flask, current_app

app = Flask(__name__)
app.config['DEBUG'] = True

まず、Flaskフレームワークとcurrent_appをインポートしています。current_appは、現在のアプリケーションインスタンスを指すグローバル変数です。

次に、Flaskアプリケーションのインスタンスを作成し、アプリケーションの設定としてDEBUGモードを有効にしています。

続いて、6~8行目です。

def do_something():
    # アプリケーションコンテキスト内でのみcurrent_appにアクセス可能
    print(current_app.config['DEBUG'])

上記の部分では、do_somethingという関数を定義しています。

この関数は、current_appを使用してアプリケーションの設定(ここではDEBUGモード)にアクセスし、その値を出力します。ただし、current_appにアクセスするためには、アプリケーションコンテキスト内でこの関数を実行する必要があります。

続いて、10~13行目です。

@app.route('/')
def index():
    do_something()
    return "Hello, World!"

Flaskのルートを定義しています。/パスにアクセスしたときに、do_something関数が呼び出され、その後に”Hello, World!”というレスポンスが返されます。

このとき、Flaskは自動的にアプリケーションコンテキストを作成するため、do_something関数内でcurrent_appにアクセスすることができます。

最後に15行目以降の部分です。

if __name__ == "__main__":
    with app.app_context():  # アプリケーションコンテキストを作成
        do_something()  # ここではcurrent_appにアクセス可能
    app.run()

with app.app_context():を使用して、手動でアプリケーションコンテキストを作成しています。このコンテキスト内では、current_appにアクセスできます。このため、do_something関数を呼び出してもエラーが発生せずにcurrent_app.config['DEBUG']の値を出力できます。

「アプリケーションコンテキスト」と「リクエストコンテキスト」

Flaskには、2つのコンテキストがあります。

アプリケーションコンテキスト」と「リクエストコンテキスト」です。それぞれについて解説します。

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

アプリケーションコンテキストは、Flaskアプリケーションの設定、データベース接続、およびその他のグローバルリソースにアクセスするための環境を提供します。

current_appgのようなグローバル変数は、アプリケーションコンテキスト内でのみアクセス可能です。

先ほど解説したコードは、アプリケーションコンテキストになります。上記のようにアプリケーションコンテキストを使用します。

リクエストコンテキストとは?

リクエストコンテキストは、特定のクライアントリクエストに関連する情報(リクエストデータ、セッション情報、ユーザー情報など)にアクセスするための環境を提供します。

requestsessionといったオブジェクトは、リクエストコンテキスト内でのみ使用できます。

例えば、以下のようなコードです。

from flask import Flask, request, session

app = Flask(__name__)

@app.route('/')
def index():
    user_agent = request.headers.get('User-Agent')
    session['user_agent'] = user_agent
    return f'Hello, your user agent is {user_agent}'

if __name__ == "__main__":
    app.run()

7~8行目の以下の部分で、リクエストやセッション情報にアクセスしています。

   user_agent = request.headers.get('User-Agent')
    session['user_agent'] = user_agent

Flaskは、リクエストコンテキストを使用することで、クライアントのユーザーエージェント情報を取得し、セッションに保存し、それをクライアントに返すという処理を行うことができます。

requestsessionオブジェクトはリクエストコンテキスト内でのみ使用でき、これによりFlaskは各リクエストに関連する情報を適切に管理します。

まとめ

今回の記事では、Flaskのアプリケーションコンテキストについて解説しました。

アプリケーションコンテキストは、Flaskアプリケーションが動作するために必要な設定やリソースにアクセスするための環境を提供するものです。Flaskを使う上で理解しておきたい内容です。

当ブログでは、このようなITに関する記事を発信しているので興味のある方は引き続きごらんください。

また、flaskについてさらに知りたい方はこちらの記事も参考にしてください。

ABOUT ME
ryu@InfraAcademyというインフラ学習サービス運営
InfraAcademyというインフラエンジニア向けの学習サービスを運営しております。 インフラエンジニアからフルスタックエンジニア、PdM サーバ、ネットワーク、セキュリティ、クラウドについて投稿します。
RELATED POST