LocaleMiddleware在非i18n url模式上重定向

2024-06-25 23:25:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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名称空间显然不在i18n_patterns中(最后,它也会生成404错误,但原始响应的内容丢失)。在

以下是ApiStuff的代码:

^{pr2}$

我使用的是django1.6.10(我知道,现在很晚了,但是我现在不能更新版本)。在

我错过什么了吗?在


Tags: djangofromimportviewapiurlconfas
2条回答

这是一个旧的bug,在这里被跟踪到:

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

404错误处理程序是Django的默认处理程序。为了翻译“找不到”的信息,它显然考虑了当前的语言。在

除非可以升级到新版本,否则可能需要定义自己的错误处理程序(包括route/url)。在

编辑:

作为一种解决方法,可以扩展LocaleMiddleware,也可以扩展CommonMiddleware。然而,404处理程序仍然可以发挥它的魔力。也许值得一试,因为它只需要几行代码。在

引用罚单:

when you request /api/raising/404/, it is redirecting the user to /en/api/raising/404/ (assuming it detects the language as en). If it tests before redirecting the user if /en/api/raising/404/ is resolvable, it would find out that this would raise a 404 as well and thus would not redirect the user.

编辑2:

作为一种替代方法,您可以不使用i18n_patterns,而只需通过browser/cookie/parameter检测/切换语言。我在一个项目(包括Django CMS)中这样做,在那里我一直遇到这些url的问题。本地化的Django站点使用i18nurl模式绝对不是先决条件。这只是上面的东西,但一点也不必要。没有它,本地化将很好地工作。如果您需要有关切换语言的中间件的帮助,请发表评论。在

可以通过使用以下url配置来解决这个问题

urlpatterns += i18n_patterns(
    url(r'^(?!api.*)stuff', DoStuff.as_view()),
)

相关问题 更多 >