sql >> Databáze >  >> NoSQL >> Redis

python flask jak předat dynamický parametr dekorátoru

Pokud v dokumentaci zkontrolujeme globální aplikaci flask, flask.g , říká:

Pro sdílení dat, která jsou platná pro jeden požadavek pouze z jedné funkce do druhé, není globální proměnná dost dobrá, protože by se ve vláknových prostředích rozpadla. Baňka vám poskytuje speciální předmět což zajišťuje, že je platný pouze pro aktivní požadavek a to vrátí různé hodnoty pro každý požadavek.

Toho je dosaženo pomocí lokálního proxy serveru pod vláknem (v flask/globals.py ):

g = LocalProxy(partial(_lookup_app_object, 'g'))

Další věc, kterou bychom měli mít na paměti, je, že Python provádí první průchod našeho dekorátoru během fáze „kompilace“, mimo jakýkoli požadavek nebo flask aplikace. To znamená key argumentu je přiřazena hodnota 'shop_{}_style'.format(g.city.id) při spuštění aplikace (když se vaše třída analyzuje/dekoruje), mimo flask kontext požadavku.

Ale můžeme snadno oddálit přístup k flask.g pomocí líného proxy, který načte hodnotu pouze při použití pomocí funkce zpětného volání. Použijme ten, který je již součástí balení 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

Obecně (pro jiné než flask nebo non-werkzeug aplikace), můžeme použít podobný LazyProxy z ProxyTypes balíček.

Bez ohledu na to, budete také chtít opravit svůj redis_hash_shop_style dekoratér nejen načíst z redis , ale také aktualizovat (nebo vytvořit) hodnotu, pokud je zastaralá (nebo neexistující), voláním zabalené f() když je to vhodné.




  1. Vytvořte reaktivní publikaci s dalšími poli v každém dokumentu

  2. MongoDB mongorestore a stávající kolekce se záznamy

  3. MongoDB:agregační rámec:$match mezi poli

  4. MongoDB $allElementsTrue