Wenn wir die Dokumentation für die globale Flaschenanwendung überprüfen, flask.g
, es heißt:
Um Daten, die nur für eine Anforderung gültig sind, von einer Funktion an eine andere weiterzugeben, ist eine globale Variable nicht gut genug, da sie in Umgebungen mit Threads brechen würde. Flask stellt dir ein besonderes Objekt zur Verfügung Dadurch wird sichergestellt, dass es nur für die aktive Anfrage gültig ist und das wird für jede Anfrage unterschiedliche Werte zurückgeben.
Dies wird durch die Verwendung eines Thread-lokalen Proxys erreicht (in flask/globals.py
):
g = LocalProxy(partial(_lookup_app_object, 'g'))
Die andere Sache, die wir im Auge behalten sollten, ist, dass Python den ersten Durchgang unseres Dekorators während der "Kompilierung"-Phase ausführt, außerhalb einer Anfrage oder eines flask
Anwendung. Das bedeutet key
Argument wird der Wert 'shop_{}_style'.format(g.city.id)
zugewiesen wenn Ihre Anwendung startet (wenn Ihre Klasse geparst/dekoriert wird), außerhalb von flask
Kontext anfordern.
Aber wir können den Zugriff auf flask.g
leicht verzögern durch Verwendung eines Lazy-Proxys, der den Wert nur bei Verwendung über die Callback-Funktion abruft. Lassen Sie uns die bereits mit flask
gebündelte verwenden , das 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
Im Allgemeinen (für Nicht-flask
oder Nicht-werkzeug
apps), können wir einen ähnlichen LazyProxy
verwenden aus den ProxyTypes
Paket.
Unabhängig davon sollten Sie auch Ihren redis_hash_shop_style
reparieren decorator, um nicht nur von redis
abzurufen , aber auch den Wert zu aktualisieren (oder zu erstellen), wenn er veraltet (oder nicht vorhanden) ist, indem das umschlossene f()
aufgerufen wird wenn angemessen.