Пространство имен URL Django «admin» не уникально. для конечных точек с косой чертой и без - PullRequest
0 голосов
/ 10 марта 2019

Я получаю это предупреждение, и я хотел бы избавиться от него ... Мои 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/, чтобы оба запроса к /admin и /admin/ приходили на сайт администратора, и это вызывает предупреждение ... Что, вероятно, не должно происходит ...

Могу я как-нибудь обойти это? (Не меняя желаемые пути URL-адресов ...)

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

EDIT:

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

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

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

1 Ответ

1 голос
/ 10 марта 2019

Теперь я вижу проблему.Если вы установите только 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]+)/$', ...),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...