#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 Да, я это понимаю. Поэтому я предложил вам добавить косую черту в ваш шаблон регулярных выражений. Я протестировал аналогичный сценарий на своем компьютере, и, похоже, он решил проблему для меня.