Skip to main content
 首页 » 编程设计

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

2024年10月24日34youxin

当我在 Django 1.8.4 上切换语言时,我遇到了一个奇怪的问题我用 Nginx 部署在生产环境中的项目+ uWSGI .问题是,当我切换语言时,我更改的每种语言都会以某种方式“记住”,并且每次刷新页面时,站点语言都会更改为我以前使用过的另一种语言。好像uWSGI的每个进程正在存储一种语言本身。当我使用 Django 运行我的项目时在本地服务器,它就像一个魅力,当我只为 uWSGI 设置 1 个进程时配置文件,它也能正常工作,但只要我只设置 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 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' 

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

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本身:

如果您使用 Memcached 缓存后端,您应该只使用基于缓存的 session 。

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