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

时间:2015-10-16 17:11:48

标签: python django nginx uwsgi

当我使用Django 1.8.4 + Nginx生成的uWSGI项目上切换语言时,我遇到了一个奇怪的问题。问题在于,当我切换语言时,不知怎的,我改变的每一种语言都被记住了#34;每次刷新页面时,网站语言都会改变为我之前使用的不同语言。好像uWSGI的每个进程都在存储语言本身。当我在本地使用Django服务器运行我的项目时,它就像一个魅力,当我只将一个进程设置为uWSGI配置文件时,它也可以正常工作,但只要我设置了2个过程再次被打破。我一直在使用:

  • Django 1.8.4
  • uWSGI==2.0.11.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,则可以正常工作。

我的意思是"切换语言"正是在Django dochttps://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'

我测试过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引擎时获取此值的方式有关吗?

我将非常感谢您就此问题向我提供的任何帮助。在此先感谢所有社区。

1 个答案:

答案 0 :(得分:2)

好吧,我终于解决了这个问题。如果没有@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。所以现在就解决了。