フラスコアプリケーショングローバルのドキュメントを確認する場合、flask.g
、それは言う:
ある関数から別の関数への1つの要求に対してのみ有効なデータを共有するには、スレッド環境で破損するため、グローバル変数は十分ではありません。 Flaskは特別なオブジェクトを提供します これにより、アクティブなリクエストに対してのみ有効になります リクエストごとに異なる値が返されます。
これは、スレッドローカルプロキシ(flask/globals.py
内)を使用して実現されます。 ):
g = LocalProxy(partial(_lookup_app_object, 'g'))
もう1つ覚えておくべきことは、Pythonは、リクエストまたはflask
の外部で、「コンパイル」フェーズ中にデコレータの最初のパスを実行しているということです。 応用。つまり、key
引数には、'shop_{}_style'.format(g.city.id)
の値が割り当てられます flask
の外部で、アプリケーションが起動したとき(クラスが解析/装飾されているとき) リクエストコンテキスト。
ただし、flask.g
へのアクセスを簡単に遅らせることができます。 コールバック関数を介して、使用時にのみ値をフェッチするレイジープロキシを使用する。すでにflask
にバンドルされているものを使用しましょう 、werkzeug.local.LocalProxy
:
from werkzeug.local import LocalProxy
class ShopAreaAndStyleListAPI(Resource):
@redis_hash_shop_style(key=LocalProxy(lambda: 'shop_{}_style'.format(g.city.id)))
def get(self):
# if not found from redis, query from mysql
pass
一般的に(flask
以外の場合 または非werkzeug
アプリ)、同様のLazyProxy
を使用できます ProxyTypes
から パッケージ。
これとは関係なく、redis_hash_shop_style
も修正する必要があります redis
からフェッチするだけでなくデコレータ 、ただし、ラップされたf()
を呼び出すことにより、古い(または存在しない)場合は値を更新(または作成)します 必要に応じて。