Back to Blog

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

flask

2024年7月29日

こんにちは!

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

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

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を使う上で理解しておきたい内容です。

今回の内容が何かのお役になれば幸いです。

ここまでお読みいただきありがとうございました。

             

Pythonの基礎から応用まで学べる
Python WebAcademy

Python WebAcademyでは、Pythonの基礎からアーキテクチャなどの応用的な内容まで幅広く学べます。また、ブラウザ上で直接Pythonコードを試すことができ、実践的なスキルを身につけることが可能です。

             Pythonの学習を始める