Depois de dar uma olhada no código fonte do Django, vejo que o Django armazena o idioma ativo no thread atual.
Dentro django.utils.translation.trans_real
:
_active = local()
...
def activate(language):
"""
Fetches the translation object for a given tuple of application name and
language and installs it as the current translation object for the current
thread.
"""
_active.value = translation(language)
Está tudo bem, mas não tenho certeza se é ou não seguro para o greenlet? Estou executando o Django com gunicorn, configurado para executar trabalhadores de eventos "verdes". local()
remendado por gevent? Ou existe uma condição de corrida em que uma solicitação pode ser atendida usando o idioma ativo de outra solicitação ao usar o gevent?
Obrigado.
Respostas:
1 para resposta № 1Ok deixa pra lá, eu encontrei a resposta em documentação de gevent: O armazenamento local de encadeamento é corrigido por gevent e se torna o armazenamento local verde. Então, tudo deve estar seguro.
Aqui estão os detalhes:
- gevent "s
patch_thread()
função corrige othread
ethreading
módulos, incluindo o patch para fazer com que o armazenamento local de threads se torne um armazenamento local verde. - gevent "s
patch_all()
chamadas de funçãopatch_thread()
. - gunicorn chama gevent "s
patch_all()
função ao iniciar um trabalhador de eventos.