我的项目有这个中间件设置:
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
仅重新定义DEBUG
(False
}和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
的一个功能就是准确地说,当访问没有语言代码前缀的本地化视图时,从用户代理标头中猜测它并重定向到前缀视图。
如何调试正在进行的操作?
答案 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。
因此同样的问题。