Se verificarmos os documentos para o aplicativo flask global,
flask.g , diz:
Para compartilhar dados válidos para uma solicitação apenas de uma função para outra, uma variável global não é boa o suficiente porque ela seria interrompida em ambientes encadeados. O Flask fornece um objeto especial que garante que é válido apenas para a solicitação ativa e isso retornará valores diferentes para cada solicitação.
Isso é feito usando um proxy local de thread (em
flask/globals.py ):g = LocalProxy(partial(_lookup_app_object, 'g'))
A outra coisa que devemos ter em mente é que o Python está executando a primeira passagem do nosso decorador durante a fase de "compilação", fora de qualquer solicitação, ou
flask inscrição. Isso significa key argumento recebe um valor de 'shop_{}_style'.format(g.city.id) quando seu aplicativo é iniciado (quando sua classe está sendo analisada/decorada), fora do flask contexto do pedido. Mas podemos atrasar facilmente o acesso a
flask.g usando um proxy lento, que busca o valor somente quando usado, por meio da função de retorno de chamada. Vamos usar o que já vem com flask , o 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
Em geral (para não
flask ou não-werkzeug apps), podemos usar um LazyProxy semelhante dos ProxyTypes pacote. Não relacionado a isso, você também deve corrigir seu
redis_hash_shop_style decorador para não apenas buscar de redis , mas também para atualizar (ou criar) o valor se estiver obsoleto (ou inexistente), chamando o f() encapsulado quando for apropriado.