我正在使用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(我知道,已经很晚了,但我现在无法更新版本)。
我错过了什么吗?
答案 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()),
)