Перенаправление с DELETE на GET в Django
Я использую Django django 4.0.8 и django-tastypie.
Почему, когда я отправляю запрос (например) DELETE http://127.0.0.1:8000/api/v1/courses/3 через Postman, я получаю перенаправление на GET /api/v1/courses/3/?
Если я посылаю http://127.0.0.1:8000/api/v1/courses/3/, то он работает правильно.
Добавление 'APPEND_SLASH = True' в settings.py не решает эту проблему.
String «MIDDLEWARE = [„django.middleware.common.CommonMiddleware“]» У меня в settings.p
Почему, когда я отправляю запрос (например) http://127.0.0.1:8000/api/v1/courses/3 через Postman, я получаю перенаправление на GET /api/v1/courses/3/?
Потому что именно так многие браузеры (и клиенты API) реализовали его [wiki]:
Многие веб-браузеры реализовывали этот код таким образом, что нарушали этот стандарт, изменяя тип запроса нового запроса на GET, независимо от типа, использованного в исходном запросе (например, POST).
Indeed, a redirect response [wiki] (status code between 300 and 399) specifies the URI in the header, but without the method. The original design was to make an identical request [wiki]:
Это приглашение агенту пользователя (например, веб-браузеру) сделать второй, в остальном идентичный, запрос к новому URL, указанному в поле location. Конечным результатом является перенаправление на новый URL.
But this was mostly ignored. Probably to implement a Post/Redirect/Get architectural pattern [wiki].
One can use HTTP 307 Temporary Redirect [wiki] or HTTP 308 Permanent Redirect [wiki] for this. Django works with a HTTP 301 redirect however, as we can see by the documentation on the APPEND_SLASH
setting [Django-doc]:
При значении
True
, если URL запроса не соответствует ни одному из шаблонов в URLconf и не заканчивается на слеш, будет выдан HTTP-перенаправление на тот же URL с добавлением слеша. Обратите внимание, что перенаправление может привести к потере любых данных, переданных в POST-запросе.
При этом для API добавление слэшей выглядит странно. API - это нечто, предназначенное для машин, поэтому можно быть более строгим в отношении поведения, которое вы ожидаете от клиента.