Ошибка 404, если ярлык начинается с «id-» на многоязычном веб-сайте с индонезийским языком в Django 3.0. - PullRequest
0 голосов
/ 05 мая 2020

http://example.com/de/id-button/ - 200 ОК

http://example.com/id/id-button/ - 200 ОК

http://example.com/any-other-slug/ - 200 OK

http://example.com/id-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,
)

У элемента есть поле заголовка в БД "id-button". Если я переименую это в «idbutton»: http://example.com/idbutton/ - 200 ОК

Но мне нужен URL-адрес, например: http://example.com/id-button/

Обновление: Это принято как ошибка, но пока не работает: https://code.djangoproject.com/ticket/31540

1 Ответ

0 голосов
/ 06 мая 2020

Это связано с взаимодействием между LocaleMiddleware и i18n_patterns.

Когда LocaleMiddleware видит входящий запрос, он пытается проанализировать язык из запроса. См. https://github.com/django/django/blob/92507bf3ea4dc467f68edf81a686548fac7ff0e9/django/utils/translation/trans_real.py#L46, чтобы узнать об используемом регулярном выражении. Допустимый формат: любая последовательность символов слова и, возможно, da sh и более символов слова, после чего ожидается либо конец строки, либо /. В этом случае он соответствует id-domain/ и понимает, что id-domain является языковым префиксом для этого запроса, в результате чего Django активирует язык id.

Затем запрос проходит через URL слой маршрутизации, достигая одной из первых остановок https://github.com/django/django/blob/master/django/urls/resolvers.py#L301. Команда get_language() возвращает id, а искомый префикс - id/, с которым id-domain/ не совпадает. Поскольку LocalePrefixPattern является преобразователем верхнего уровня, его несоответствие не приводит к необходимости пробовать больше ничего.

(Это ошибка в Django? Возможно, я ожидал бы, что он увидит id-domain/ как language может также использоваться для языкового префикса для разрешения URL. Но даже тогда это может не решить вашу проблему)

...