1. ホーム
  2. python

[解決済み] flaskアプリケーションでグローバルな状態を保持する [重複]。

2023-06-08 11:01:42

質問

キャッシュ辞書を flask アプリケーションでキャッシュ辞書を保存しようとしています。

私が理解している限りでは アプリケーションコンテキスト は、特に flask.gオブジェクト を使用する必要があります。

設定します。

import flask as f

app = f.Flask(__name__)

さて、そうすると

with app.app_context():
    f.g.foo = "bar"
    print f.g.foo

印刷されます。 bar .

の続きです。

with app.app_context():
    print f.g.foo

AttributeError: '_AppCtxGlobals' object has no attribute 'foo'

私はそれを理解していないし、ドキュメントはまったく助けにならない。私がそれらを正しく読むならば、状態は保存されているはずです。

別のアイデア モジュール全体の変数を使用することです。

cache = {}

def some_function():
    cache['foo'] = "bar"

しかし、これらはリクエストのたびにリセットされるようです。

これを正しく行うにはどうしたらよいでしょうか。

編集してください。 フラスコ 10.1

どのように解決するのですか?

ご質問の内容からすると、quot;global"の定義について混乱されているのだと思います。

Flaskの純正セットアップでは、複数のスレッドと潜在的に複数のプロセスでリクエストを処理するFlaskサーバーがあります。例えば、"itemlist = []"のようなストックグローバル変数を持っていて、誰かがエンドポイントにPOSTリクエストを行うたびに、リクエストごとにそれを追加し続けたいとします。これは理論的にも実践的にも完全に可能です。また、本当に悪い考えです。

問題は、どのスレッドとプロセスが "win"であるかを簡単に制御できないことです。つまり、ロック、ミューテックス、およびその他のプリミティブについて話す必要があります。これは困難で迷惑なことです。

ウェブサーバー自体を可能な限りステートレスにしておく必要があります。各リクエストは完全に独立しているべきで、サーバー内で状態を共有してはいけません。その代わりに、状態を処理するデータベースやキャッシュレイヤーを使用します。これはより複雑に見えますが、実際にはよりシンプルです。例えばSQLiteをチェックしてみてください、とてもシンプルです。

flask.g'オブジェクトに対処するために、これはグローバルオブジェクトである リクエストごとに .

http://flask.pocoo.org/docs/api/#flask.g

これはリクエスト間で "wiped clean" され、リクエスト間で状態を共有するために使用することはできません。