Пространство имен URL Django ‘admin’ не уникально. для конечных точек с косой чертой и без нее

#python #django #url #request

#python #django #url #запрос

Вопрос:

Я получаю это предупреждение, и я хотел бы избавиться от него… Мой urls.py

 urlpatterns = [
    path('admin/', admin.site.urls),
    path('admin', admin.site.urls),
    re_path(r'^(?P<Model>[A-Za-z] )',
        GenericViewSet.as_view({'get': 'list', 'post': 'create'}),
    ) # aka model endpoint

]
  

Чего я хочу добиться, так это запроса на /admin и /admin/ перехода на сайт администратора, а любой другой запрос будет передан в мой общий API обработки моделей.

Проблема в том, что когда я устанавливаю только path('admin/', admin.site.urls) , запрос на /admin попадает в конечную точку модели, а когда я устанавливаю только path('admin', admin.site.urls) , запрос на /admin/ попадает в конечную точку модели. Я понимаю, почему это происходит, Django перебирает все конечные точки, прежде чем добавить косую черту в конец и снова просмотреть их с добавленной косой чертой.

Итак, я должен указать оба admin и admin/ path, чтобы оба запроса к /admin и /admin/ попадали на сайт администратора, и это вызывает появление предупреждения… Чего, вероятно, не должно происходить…

Могу ли я как-то обойти это? (Без изменения моих желаемых URL-путей …)

p.s. Я APPEND_SLASH установил значение True

Редактировать:

Когда я использую только

 urlpatterns = [
    path('admin/', admin.site.urls),
]
  

оба запроса на /admin и /admin/ корректно попадают на страницу администратора.

Комментарии:

1. Django по умолчанию перенаправляет URL-адреса без косой черты на URL-адреса с косой чертой, т.е. /admin на /admin/ . Вам не нужны два URL. Смотрите APPEND_SLASH настройки.

2. Проблема в том, что когда я задаю только path (‘admin /’, admin.site.urls), запрос к /admin попадает в конечную точку модели, а когда я задаю только path (‘admin’, admin.site.urls), запрос к / admin / попадает в конечную точку модели. Чего не должно происходить… Вероятно, это настоящая проблема.

Ответ №1:

Теперь я вижу проблему. Если вы только устанавливаете admin/ и не устанавливаете admin , это сопоставляется с вашим регулярным выражением.

Из APPEND_SLASH документации (выделено мной):

…если URL запроса не соответствует ни одному из шаблонов в URLconf и не заканчивается косой чертой, на тот же URL выдается HTTP-перенаправление с добавлением косой черты.

Итак, django не перенаправляет admin на admin/ , потому что ваш шаблон регулярных выражений совпадает с admin , поскольку ваше выражение не содержит косой черты в конце.

Вы должны указать косую черту и знак доллара в вашем шаблоне регулярных выражений, чтобы django сопоставлял полный URL с косой чертой.

Это должно сработать:

 path('admin/', admin.site.urls),

re_path(r'^(?P<Model>[A-Za-z] )/$', ...),
  

Комментарии:

1. Проблема в том, что когда я задаю только path (‘admin /’, admin.site.urls), запрос к /admin попадает в конечную точку модели, а когда я задаю только path (‘admin’, admin.site.urls), запрос к / admin / попадает в конечную точку модели. Я понимаю, почему это происходит, Django перебирает все конечные точки, прежде чем добавить косую черту в конец и снова просмотреть их с добавленной косой чертой.

2. @Charlestone Да, я это понимаю. Поэтому я предложил вам добавить косую черту в ваш шаблон регулярных выражений. Я протестировал аналогичный сценарий на своем компьютере, и, похоже, он решил проблему для меня.