質問: タイトル通りです。contextの意味がわかりません。 以下、公式ドキュメントを読みましたが、メタレベルでの定義は理解できますが、公式ドキュメントから具体的かつ正確な意味がわかりません。色々調べてもなんとなくでしか理解できない状態にあります。いまのところ、使い方はなんとなくわかるので雰囲気でつかっていたりしています。 詳しい方で咀嚼して説明して頂けますと嬉しいです。以下三点が気になっています。 * contextの役割はなにか? * なぜ、なんのためにcontextが必要なのか? * 文章内にあるpushとは何をしているのか? 質問の背景 pythonでいうコンテキストの意味とflaskでいうコンテキストの違いさえ分からない状態でしたのでpythonでのコンテキストという質問にしました。今の理解では、http requestに対して発生するappを疑似的に起動し、実行後終了するという曖昧な理解にとどまっています。この理解であってますでしょうか? ここで質問することで自分のわからないところを具体的にし、自分でもっと細かい検索キーワードで検索できればより理解が深まる情報に辿りつけると思い、このような質問を投稿しました。 http://flask.pocoo.org/docs/1.0/appcontext/#creating-an-application-context ``` Purpose of the Context The Flask application object has attributes, such as config, that are useful to access within views and CLI commands. However, importing the app instance within the modules in your project is prone to circular import issues. When using the app factory pattern or writing reusable blueprints or extensions there won’t be an app instance to import at all. Flask solves this issue with the application context. Rather than referring to an app directly, you use the the current_app proxy, which points to the application handling the current activity. Flask automatically pushes an application context when handling a request. View functions, error handlers, and other functions that run during a request will have access to current_app. Flask will also automatically push an app context when running CLI commands registered with Flask.cli using @app.cli.command(). ```
回答: `context`には日本語でバッチリ対応する言葉・概念がないので理解が難しいのだと推測します。少なくとも私の場合はそうでした。コンテクストを理解する上で重要な事柄は提示のURLにも明記されています。 > > (The application) context keeps track of (the application-level) data > > コンテクストはひとつながりのデータを保持します。 > > > これによってコンテクスト自体が理解できなくとも、少なくともその役割がデータの保持である点は理解できると思います。そしてそのコンテクストの目的は一連のデータを扱いやすいようにひとまとめにすることです。 また以下のようにも述べられています。 > > Flask solves this issue with the application context. > > Flaskはこの問題(or 課題)をアプリケーションコンテクストで解決します。 > > > 時間がないので回答はこのへんで切り上げますが、この情報をもとにもう一度ドキュメントを読み解くと理解が増すと思います。ちなみにコンテクストはsslのような設定が非常に煩雑なところや、状態を保持しながら処理を数珠つなぎにするような場面(clickパッケージ)でも使用します。