Django 1.4 LocaleMiddleware不能与Apache一起使用,但可以与runserver一起使用

时间:2012-07-14 15:27:02

标签: django localization django-middleware url-pattern

我的项目有这个中间件设置:

MIDDLEWARE_CLASSES = (
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
    # Uncomment the next line for simple clickjacking protection:
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
)

对于本地开发,我设置了一个local_settings.py模块,它将中间件设置重新定义为:

MIDDLEWARE_CLASSES = (
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
)

这里我只是删除与缓存相关的中间件,仅用于开发。

在我的Apache部署中,local_settings.py仅重新定义DEBUGFalse}和DATABASES dict。

我甚至在项目的生产virtualenv(Apache服务器使用的那个)中安装了IPython并执行了这个:

In [1]: from django.conf import settings

In [2]: settings.MIDDLEWARE_CLASSES
Out[2]: 
('django.middleware.cache.UpdateCacheMiddleware',
 'django.middleware.locale.LocaleMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
 'django.middleware.cache.FetchFromCacheMiddleware')

但是,尽管如此,我仍然需要在网址中输入语言标识符(httpp://mysite.com/en/myview/)来访问使用from django.conf.urls.i18n.i18n_patterns的任何网址。 django.middleware.locale.LocaleMiddleware的一个功能就是准确地说,当访问没有语言代码前缀的本地化视图时,从用户代理标头中猜测它并重定向到前缀视图。

如何调试正在进行的操作?

2 个答案:

答案 0 :(得分:2)

我弄清楚了(愚蠢的问题......)查看代码,django.middleware.locale.LocaleMiddleware首先检查响应状态代码是否为404(未找到),然后使用该语言重试请求代码前缀。但是,该代码永远不会被执行...只是因为我没有创建404.html模板,引发异常等等......

这也解释了为什么它在DEBUG = True时有效,因为在调试模式下永远不会使用404.html模板。

刚刚创建了相应的404.html模板,一切正常。

答案 1 :(得分:1)

我刚遇到同样的问题,但是: 我在urlconf中定义了一个handler_404,指向一个视图。 此视图返回了一个HttpResponse,但使用status_code = 200而不是404。 因此同样的问题。