Как передать CSRF-токен вручную для POST-запросов в ajax Django

<

Вы можете попробовать добавить следующее в ваш ajax-пост

data['csrfmiddlewaretoken'] = jQuery("[name=csrfmiddlewaretoken]").val()

где data - данные, которые вы хотите отправить на сервер. Для того чтобы это работало, вам необходимо иметь {% csrf_token %} где-то на вашем сайте, иначе jQuery не сможет найти значение токенов.

Вы можете передать токен csrf из представления. Вы можете получить его одним из этих двух способов (эти способы я тестировал лично и уверен, что они работают):

  1. csrf_token = self.request.COOKIES.get('csrftoken')
  2. Второй вариант, как правило, более надежен. Я не помню точно, в каком конкретном случае это было, но однажды он сработал там, где первое решение, предложенное здесь, потерпело неудачу.
# import
from django.middleware.csrf import get_token

# in the view
csrf_token = get_token(request)

После того, как вы получили токен, вы должны передать его шаблону любым способом. Предположим, что вы просто добавите его в контекстную переменную следующим образом:

context['csrf_token'] = csrf_token

Отлично, теперь в шаблоне вы должны отправлять его вместе с каждым запросом. По моему опыту, это нужно делать только с запросами POST. Способ отправки заключается в том, чтобы включить его в заголовки:

let response = await fetch('/my/api/url', {
    method: 'POST',
    body: JSON.stringify({
        'field1: 'value1',
        ...
    }),
    headers: {
        'X-CSRFToken': "{{ csrf_token }}",
        'Content-type': 'application/json'
    }
}).then(...

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