見出し画像

Flask Web Development 10~15

アプリケーションコンテクストってなんだ!?

2つの起動方法
1. app.run()
2. set FLASK_APP=hello.py (or export FLASK_APP=hello.py)

参考ページ1の中のYoutubeを見ていたら、gunicornなるものが出てきて気になっている。
=> Pythonの標準だとWSGI refというのがあるらしい。
=>気になるぜ!

WSGIについて&Flask勉強するならとてもためになる動画

アプリケーションコンテクストの話に入る前に、HTTPのRequestとResponseを参考サイトで理解しておきましょう。

Flaskでは以下の4つのRequestがあります。

コンテキスト 変数 用途
アプリケーションコンテキスト: current_app 主にこれを使って、自作関数とかを絡めてapplicationを起動させます。
アプリケーションコンテキスト:  g 主にリクエストを跨いで使用するオブジェクトを保存する。しかし、リクエストを跨いでオブジェクトは保存されない。
リクエストコンテキスト: request、HTMLとかで利用しているrequestと同じです。GET、POSTなどを受け取ります。
リクエストコンテキスト: session 主にリクエストを跨いで使用するオブジェクトを保存する。リクエストを跨いでオブジェクトが保存される。 ただし、シリアライズ可能なもののみ。

とここまで来てFlaskの公式ページを読んでアプリケーションコンテキストの理解に努めました。

アプリケーションコンテキスト(current_app & g)を使う理由は
1. Flaskプログラムを実行するために、全ての関数を動かすために大量の引数が必要になる可能性があるので、その場合は関数毎の処理を行うのではなく、アプリケーションレベルの処理を行う方が効率がいいので、各関数のInput&Outputをcurrent_appに格納することで処理をスムーズに行う。
2. 別のモジュールが互いに参照しあう循環インポート問題を回避するため。
3. Flaskアプリのコードでは、importされただけではFlaskアプリのインスタンスを作成・提供しない場合があるので、それを防ぐ。

current_appとappの違いについては以下のページが参考になります。

アプリケーションコンテキストは、要求、CLIコマンド、またはその他のアクティビティ中にアプリケーションレベルのデータを追跡します。アプリケーションを各関数に渡すのではなく、代わりに current_app プロキシと g プロキシにアクセスします。
これは、リクエスト中にリクエストレベルのデータを追跡するリクエストコンテキストに似ています。リクエストコンテキストがプッシュされると、対応するアプリケーションコンテキストがプッシュされます。

ん、つまりcurrent_appはrequstをpushするとできるわけだな。同じ感じの動きをするんだな。

appliation contextがどのように動くのかをテストする。
>>> from hello import app <-前回の記事で作成したhello.pyから変数appを取り出す。appの中にはhello.pyの名前helloが入っている。
>>> from flask import current_app <- flaskモジュールからcurrent_appのクラスをimportする
>>> current_app.name <- .nameでhelloの名前を取り出したいが、
Traceback (most recent call last):
...
RuntimeError: working outside of application context <- application context外だよとエラーが出力される。
>>> app_ctx = app.app_context() <-app_context()を使用して、current_appへアクセスできるようにする。
>>> app_ctx.push() <- pushします
>>> current_app.name <- 再度出力すると
'hello' <-無事にhelloを取り出せる。
>>> app_ctx.pop() <- popで削除


Chapter2で理解できなくても、Chapter7でも説明するから安心して欲しいとか書いているのでとりあえず安心しよう。
Chapter7を読んだら加筆するかも。


この記事が気に入ったらサポートをしてみませんか?