コンテキストって、なんだかふんわりとした概念なので、もう少し勉強したいです。
チュートリアルでは、いきなり使っていたので、どのようなものか勉強した方がいいかもしれないね〜
flaskの「Quick Start」 と「Tutorial」をやってきました。実践的でしたので、出てきた概念としてコンテキストがまだふわっとしています。Flaskのドキュメントにアプリケーションコンテキストの項目がありましたので、このページを勉強していきたいと思います。
こんな人の役に立つかも
・PythonでWebアプリケーションを作成したい人
・flaskのチュートリアルを行なっている人
・flaskのチュートリアルでブログアプリflaskrを作成している人
コンテキスト
チュートリアルを進めてきて、コンテキストという概念がふわっと現れました。
「QuickStart」までのチュートリアルでは、コンテキスト、というものを特に意識せずにアプリ開発をしてきました。「Tutorial」の「Test coverage」の項目から、コンテキスト、というものを意識しないとテスト用プログラムを組むことが難しくなりました。コンテキストは、普通にアプリを作成しているときは、あまり意識せずに利用できます。チュートリアルの通りに「request」をimportしてクライアントからのリクエスト情報にアクセスしたり、「current_app」というものでアプリの設定情報である「config」にアクセスする、とルール通りに行えば問題なくアプリ開発ができると思います。
しかし、テスト用のプログラムを作成するとなると、コンテキストという概念を意図的にコントロールする必要がありました。
ほんとさりげなくふわっと現れました 笑
flaskの二種類のコンテキスト
Flaskには
・アプリケーションコンテキスト
・リクエストコンテキスト
という二種類のコンテキストがあります。
実は、クイックスタートで、さりげなくリクエストコンテキストについて説明が出てきていました^^;
このときはいまいちよくわからず突き進んでましたね。
アプリケーションコンテキストについて
Flaskのアプリケーションには「config」などのアプリケーション固有の属性情報のようなものがあります。
例えば、データベースへの接続では次のようにconfigが使われていました。
current_app.config['DATABASE']
view関数や、CLIコマンド(init-dbのようにflaskコマンドで実行できるような命令プログラム)のプログラミングでは、「current_app」というプロキシ(代替で用意された変数のような意味??)でアクセスできるようになっています。このときにすでにさりげなくアプリケーションコンテキストを利用していることになります。
一般的には、インスタンス化されたオブジェクトの変数にアクセスするときには「app.config」のようにアクセスすると思いますが、flaskではこれを避けています。
appにアクセスしない意味(の一つ)
特に、チュートリアルで学んだ「アプリケーションファクトリ」(create_app関数)の仕組みでアプリを作成する場合、「__init__.py」に作成したcreate_appを実行しないとインスタンスを取得できないことです。db.pyでappにアクセスしたいとき、create_appを実行してインスタンスを取得する、としても、これは新しく作成したアプリであって、実行中のアプリではないということになってしまいます。
まあ、多分こういう意味でコンテキストが使われるのかな・・・と思っています。
flaskは、一度create_appなどでアプリケーションのインスタンスを作成すると、このアプリをcurrent_appとしてアクセスできるような仕組みを提供してくれます。
アプリケーションコンテキストの生存期間
flaskアプリがリクエストを処理し始めると、アプリケーションコンテキスト→リクエストコンテキストの順番にPushされるとのことです。
Pushということで、flaskではスタックを利用してコンテキストを管理するようです。
そして、リクエスト処理が終了するとリクエストコンテキスト→アプリケーションコンテキストの順番にPopされるようです。
スタックは、入り口と出口が同じデータ格納庫なので、PUSHした順番にPOPして取り出すようなデータ構造になります。
今回のまとめ
続きは次回また勉強していきたいと思います。今回勉強したことは次のようになりました。
・コンテキストにはアプリケーションコンテキストと、リクエストコンテキストの二種類ある。
・アプリケーションコンテキストのcurrent_appはappインスタンスの代替。
・コンテキストはリクエスト開始と終了時にスタックのデータ構造で出し入れされる。
考えずに、感じ取ることも大事・・・