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é.