Django 1.8.4 的语言切换问题和具有多个进程的 uWSGI 配置

Language switching issue with Django 1.8.4 and uWSGI config with several processes

当我在使用 Nginx + uWSGI 部署到生产环境的 Django 1.8.4 项目上切换语言时,我遇到了一个奇怪的问题。问题是,当我切换语言时,不知何故,我更改的每种语言都是 "remembered",并且每次刷新页面时,站点语言都会更改为我以前使用过的另一种语言。 uWSGI 的每个进程似乎都在存储一种语言本身。当我 运行 我的项目在本地使用 Django 服务器时,它就像一个魅力,当我只为 uWSGI 配置文件设置 1 个进程时,它也能正常工作,但很快因为我只设置了 2 个进程,所以它又被破坏了。我一直在使用:

uWSGI 配置文件下面我有:

uwsgi.ini

[uwsgi]
socket=127.0.0.1:8080
chdir=/path/to/code
wsgi-file=wsgi.py
need-app=true
processes=8
master=true
enable-threads=true
thunder-lock=true
single-interpreter=true
plugin=python

正如我在上面评论的那样,如果我将配置文件保留为 processes=1,它会正常工作。

我所说的 "switch the language" 正是 Django doc 的这一部分所写的内容:https://docs.djangoproject.com/en/1.8/topics/i18n/translation/#explicitly-setting-the-active-language。我有这样的实用程序:

def activate_language(request, language_code):
    """
    Explicitly setting the active language.
    As to the doc:
    https://docs.djangoproject.com/en/1.8/topics/i18n/translation/#the-set-language-redirect-view#s-explicitly-setting-the-active-language
    :param language_code: the language code: en, es, da, and so on.
    :return:
    """
    activate(language_code)
    request.session[LANGUAGE_SESSION_KEY] = language_code

在完成了优秀的问题之后,我想把更多的细节放在这里。我正在使用这个 session engine:

SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'

并且我已经测试过数据库上会话的值已正确更新:

In [13]: Session.objects.get(pk='lrx8sdzbabztc8wifiab5i5gmqiwuxnn').get_decoded()
Out[13]: {u'_language': u'es'}

In [14]: Session.objects.get(pk='lrx8sdzbabztc8wifiab5i5gmqiwuxnn').get_decoded()
Out[14]: {u'_language': u'en'}

In [15]: Session.objects.get(pk='lrx8sdzbabztc8wifiab5i5gmqiwuxnn').get_decoded()
Out[15]: {u'_language': u'da'}

但即使此值按应有的更改,问题仍然存在。不过我对此有一些线索。当我使用以下任何一项时 session engines:

"django.contrib.sessions.backends.file"
"django.contrib.sessions.backends.signed_cookies"

它就像一个魅力。那么会不会跟使用cached_db引擎时获取这个值的方式有关呢?

如果您能就此问题给我任何帮助,我将不胜感激。预先感谢所有社区。

好吧,我终于解决了这个问题。如果没有 @iamkhush 的帮助,我无法做到这一点,他提出了很好的问题,指导我进行修复。设置 Memcache 后问题已解决。关键在于 Django session doc 本身:

You should only use cache-based sessions if you’re using the Memcached cache backend.

这正是我的问题,我使用 django.contrib.sessions.backends.cached_db 作为 SESSION_ENGINE 但我没有使用 Memcache。所以现在解决了。