【问题标题】:LocaleMiddleware redirects on a non-i18n url patternLocaleMiddleware 在非 i18n url 模式上重定向
【发布时间】:2017-07-04 14:09:01
【问题描述】:

我正在使用 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/&lt;stuff_id&gt;,即使/api命名空间显然不是在i18n_patterns 中(最后,它也会产生 404 错误,但我原来的响应内容丢失了)。

这里是ApiStuff的代码:

import django.http
from django.views.generic import View
from project.stuff.models import Stuff


class ApiStuff(View):

    @staticmethod
    def get(request, *args, **kwargs):
        stuff_id = kwargs['stuff_id']

        try:
            stuff = Stuff.objects.get(pk=stuff_id)
        except Stuff.DoesNotExist:
            return response({"error": "stuff not found"}, 404)

        result = stuff.serialize()
        return response(result)


def response(data, status=200):
    data = json.dumps(data)
    return django.http.HttpResponse(data, status=status, content_type='application/json')

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

我错过了什么吗?

【问题讨论】:

  • 即使你使用get_object_or_404,你还会遇到同样的问题吗?我想知道如果通过中间件传播 404 异常,系统的行为是否会有所不同。
  • @Risadinha 是的,重定向与get_object_or_404 相同

标签: python django internationalization django-1.6


【解决方案1】:

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

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

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

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

编辑:

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

引用票:

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

编辑 2:

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

【讨论】:

  • 其实我也看到了这个ticket,不过我已经查了当时1.6.10已经打补丁了(这个版本是2015年1月发布的,ticket是2012年关闭的)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-18
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多