Django的翻译是否安全?

时间:2013-04-07 09:30:25

标签: django internationalization gevent gunicorn

在看了Django的源代码之后,我看到Django将活动语言存储在当前线程中。

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)    

这一切都很好,但我不确定它是否是绿色安全的?我正在使用gunicorn运行Django,配置为运行“绿色”gevent worker。是local()由gevent修补?或者是否存在竞争条件,在使用gevent时可能使用其他请求的活动语言提供请求?

感谢。

1 个答案:

答案 0 :(得分:2)

Ok没关系,我在gevent's documentation找到了答案:线程本地存储由gevent进行猴子修补,并成为greenlet-local存储。所以一切都应该是安全的。

以下是详细信息:

  • gevent的patch_thread()函数修补了threadthreading模块,包括使线程本地存储成为greenlet-local存储的补丁。
  • gevent的patch_all()函数调用patch_thread()
  • gunicorn在启动gevent worker时调用gevent的patch_all()函数。