【问题标题】:Django 1.4 LocaleMiddleware not working with Apache, but works with runserverDjango 1.4 LocaleMiddleware 不能与 Apache 一起使用,但可以与 runserver 一起使用
【发布时间】:2012-07-14 03:48:49
【问题描述】:

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

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 字典。

我什至在项目的生产 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')

但是,尽管如此,我仍然必须在 URL 中输入语言标识符(如 httpp://mysite.com/en/myview/)才能访问使用 from django.conf.urls.i18n.i18n_patterns 的任何 URL。 django.middleware.locale.LocaleMiddleware 的功能之一就是做到这一点,当访问没有语言代码前缀的本地化视图时,从用户代理标题中猜测它并重定向到前缀视图。

如何调试发生了什么?

【问题讨论】:

    标签: django localization django-middleware url-pattern


    【解决方案1】:

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

    【讨论】:

    • 我将handler_404 设置为指向我编写的视图。此视图返回一个简单的 HttpResponse(包含有关未找到页面的信息)。但默认情况下,HttpResponse 有一个名为status_code 的属性,其值为 200,表示“OK”。我必须将 HttpResponse 更改如下:output = render_to_response(...)output.status_code = 404
    【解决方案2】:

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

    这也解释了为什么它在 DEBUG = True 时起作用,因为在调试模式下,404.html 模板从不使用。

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

    【讨论】:

      猜你喜欢
      • 2014-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-19
      相关资源
      最近更新 更多