LocaleMiddleware在非i18n url模式上重定向

时间:2017-07-04 14:09:01

标签: python django internationalization django-1.6

我正在使用Django的LocaleMiddleware将我正在处理的网站的一部分国际化。 这是我的项目urls.py

from django.conf.urls import patterns, include, url
from django.conf.urls.i18n import i18n_patterns

urlpatterns = patterns('',
    url(r'^api/stuff/(?P<stuff_id>)\d+/$', ApiStuff.as_view()),
)

urlpatterns += i18n_patterns('',
    url(r'^stuff/', DoStuff.as_view()),
)

问题是,当ApiStuff.as_view()返回404响应(其他错误代码按预期行为)时,LocaleMiddleware会操作请求以使其重定向到/en/api/stuff/<stuff_id>,即使/api {1}} {{}}} {{}} {{}}

以下是i18n_patterns的代码:

ApiStuff

我使用django 1.6.10(我知道,已经很晚了,但我现在无法更新版本)。

我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

这是一个已在此处跟踪的旧错误:

https://code.djangoproject.com/ticket/17734

404错误处理程序是Django的默认处理程序。它显然需要考虑当前语言才能翻译“未找到”消息。

除非您可以升级到更新版本,否则您可能需要定义自己的错误处理程序(包括路由/网址)。

编辑:

作为一种解决方法,可以扩展LocaleMiddleware,也可以扩展CommonMiddleware。但是,404处理程序可能会发挥其魔力。可能值得一试,因为它只需要几行代码。

引用门票:

  

当你请求/ api / raise / 404 /时,它会将用户重定向到/ en / api / raise / 404 /(假设它将语言检测为en)。如果它在重定向用户之前测试,如果/ en / api / raise / 404 /是可解析的,那么它会发现这也会引发404,因此不会重定向用户。

编辑2:

作为替代方案,您可以简单地不使用i18n_patterns,只需通过浏览器/ cookie /参数检测/切换语言。我为一个项目(包括Django CMS)做了这个,我一直遇到这些URL的问题。绝对不是本地化Django站点使用i18n URL模式的先决条件。这只是最重要的事情,但根本不需要。如果没有它,本地化将正常工作。如果您需要有关中间件的帮助来切换语言,请发表评论。

答案 1 :(得分:0)

可以使用以下url config

解决此问题
urlpatterns += i18n_patterns(
    url(r'^(?!api.*)stuff', DoStuff.as_view()),
)