Как заставить 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/

Вернуться на верх