在Django 3.0的印尼语多语言网站上,如果slug以 "id-"开头,会出现404错误。

问题描述 投票:0回答:1

http:/example.comdeid-button)。 - 200 OK

http:/example.comid-button。 - 200 OK

http:/example.comany-other-slug。 - 200 OK

http:/example.comid-button - 404错误。

Using the URLconf defined in example.urls, Django tried these URL patterns, in this order:
id/
The current path, id-button/, didn't match any of these.

urls.py文件。

urlpatterns = i18n_patterns(
    path('admin/', admin.site.urls),
    path('', cache_page(cache_homepage)(homepage_views.index), name='index'),
    path('search/', search_views.search, name='search'),
    path('<slug:slug>/', item_views.item, name='item'),
    prefix_default_language=False,
)

该项目在DB "id-button "中有一个slug字段,如果我将其重命名为 "idbutton"。http:/example.comidbutton)。 - 200 OK

但我需要有一个网址,如 http:/example.comid-button。

更新一下。已接受为BUG,但暂时没动。https:/code.djangoproject.comticket31540。

django django-views django-urls django-i18n django-errors
1个回答
0
投票

这是由以下两方面的互动造成的 LocaleMiddlewarei18n_patterns.

LocaleMiddleware 看到请求进来,它就会尝试从请求中解析语言。请看 https:/github.comdjangodjangoblob92507bf3ea4dc467f68edf81a686548fac7ff0e9djangoutilstranslationtrans_real.py#L46。 为所用的正则表达式。允许的格式是:任何单词字符的序列,以及可选的破折号和更多的单词字符,之后它期望字符串的结尾,或者是一個 /. 在这种情况下,它符合 id-domain/并理解 id-domain 是该请求的语言前缀,使得Django激活了 id 语言。

然后,请求经过URL路由层,作为第一站到达的是 https:/github.comdjangodjangoblobmasterdjangourlsresolvers.py#L301。 . 该 get_language() 命令返回 id,因此搜索的前缀是 id/,其中 id-domain/ 并不与之匹配。由于 LocalePrefixPattern 是顶层的解析器,它不匹配会导致没有其他的尝试。

(这是Django的一个bug吗?也许吧,我希望它看到 id-domain/ 作为语言,会使它也被用于URL解析的语言前缀。但即使这样,也未必能解决你的问题)

© www.soinside.com 2019 - 2024. All rights reserved.