Flask Web Development P10~15

Flask
Amazon.co.jp

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

Flask の session と g そしてコンテキスト | 民主主義に乾杯
session と g は、グローバル変数です。コンテキストは、このグローバル変数を管理する箱です。

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

How Patreon got hacked – Publicly exposed Werkzeug Debugger
Patreon got hacked. We reported a specific Remote Code Execution to them due to a public debugger before they were breached. We believe this was the attack meth...

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

新規ドメインを取得してWebサイトに反映させるまで何時間かかるか?【XSERVER/AWS-EC2】
こんにちは、えびかずきです。 最近Webアプリ開発を勉強していましたが、とうとう試作品が完成しました! アプリのWeb公開までは済んでいるのですが、後は仕上げの独自ドメイン化が必要です。 ということで今回は、独自ドメインを取得してサイトに反

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

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

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

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

アプリケーションのコンテキスト(The Application Context) — Flask Documentation (2.0.x)

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

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

current_app vs app のちがいは?|teratail
current_appの説明がしっくりと理解できません。flaskでORMを書いていますが、調べながら見よう見まねで動かしつつ、flask-migrateを実行してmigrationファイルができるという状況です。しかし、ちゃんと理解できていません。とりわけ、current_appについて理解できて

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

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

application 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を読んだら加筆するかも。

Amazon | Flask Web Development: Developing Web Applications with Python | Grinberg, Miguel | Software Development
Amazon配送商品ならFlask Web Development: Developing Web Applications with Pythonが通常配送無料。更にAmazonならポイント還元本が多数。Grinberg, Miguel作品ほか、お急ぎ便対象商品は当日お届けも可能。

前回の記事はこちら

次の記事はこちら

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