Как заставить request.is_ajax() работать с JS fetch()
Объект запроса Django request
имеет изящный небольшой метод is_ajax()
. Он позволяет определить, поступил ли запрос от JS-фреймворка (он же ajax старой школы). Хотя он отлично работает с некоторыми библиотеками JS, включая почтенный jQuery, он не будет работать с современным встроенным в JS fetch()
.
Причина
Если мы посмотрим на внутренности request:
def is_ajax(self):
return self.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'
то увидим, что для объявления запроса в виде ajax наш метод ожидает, что заголовок HTTP_X_REQUESTED_WITH
будет отправлен вместе с запросом. Значение заголовка должно равняться XMLHttpRequest.
Решение
Хорошо, это означает, что нам просто нужно добавить HTTP_X_REQUESTED_WITH: 'XMLHttpRequest'
в запрос fetch()
, и все готово, верно? Неправильно, это не будет работать, потому что вместо того, чтобы назвать его HTTP_X_REQUESTED_WITH
, неужно назвать его X-Requested-With
, и только тогда он сработает. Странно, а?
Вот рабочий пример того, как это сделать:
fetch('/submit-form', {
method: "POST",
...
headers: {
"X-Requested-With": "XMLHttpRequest"
},
...
});
Здесь намеренно пропущены другие части запроса fetch()
, которые могут отличаться в зависимости от вашей ситуации.
Перевод https://timonweb.com/tutorials/how-to-make-django-requestis_ajax-work-with-js-fetch/
Вернуться на верх