Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Python-Kolben, wie man einen dynamischen Parameter an einen Dekorateur übergibt

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.