Django добавляет слеш в динамический сегмент URL

У меня динамический url настроен следующим образом:

path('segment/', func1, name='func1'),
path('segment/<str:string>/', string, name='string'),

Однако когда я перехожу к https://example.com/segment/watch?v=nTeq0U_V15U (watch?v=nTeq0U_V15U - это строка), в середине автоматически добавляется косая черта, в результате чего получается https://example.com/segment/watch/?v=nTeq0U_V15U/. Интересно, что при этом не возникает ошибка 404, хотя у меня нет шаблона URL с 3 сегментами в urls.py. Однако мой вопрос заключается в том, почему добавляется косая черта и как этого избежать?

Однако меня интересует, почему добавляется слэш и как этого избежать?

Из-за настройки APPEND_SLASH [Django-doc], которая по умолчанию установлена на True.

Это позволит, если для заданного пути не найдено совпадений, и путь не заканчивается слешем, сделать переадресацию на путь со слешем, так что браузер попытается получить страницу, заканчивающуюся слешем.

Но вопрос показывает некоторое непонимание. Действительно, если написать:

https://example.com/segment/watch?v=nTeq0U_V15U
       \___ ______/\______ _____/\_____ ______/
           v              v            v
        hostname        path       querydict

тогда ?v=nTeq0U_V15U является не частью path, а частью querydict, поэтому он не совпадет с <str:string>, а только с <<<11>>

>

Таким образом, вы получаете, что в вашем представлении это выглядит так:

def string(request, string):
    # string will be 'watch'
    print(request.GET['v'])  # nTeq0U_V15U
    # …
Вернуться на верх