Как передать CSRF-токен вручную для POST-запросов в ajax Django
<Вы можете попробовать добавить следующее в ваш ajax-пост
data['csrfmiddlewaretoken'] = jQuery("[name=csrfmiddlewaretoken]").val()
где data
- данные, которые вы хотите отправить на сервер.
Для того чтобы это работало, вам необходимо иметь {% csrf_token %}
где-то на вашем сайте, иначе jQuery не сможет найти значение токенов.
Вы можете передать токен csrf из представления. Вы можете получить его одним из этих двух способов (эти способы я тестировал лично и уверен, что они работают):
csrf_token = self.request.COOKIES.get('csrftoken')
- Второй вариант, как правило, более надежен. Я не помню точно, в каком конкретном случае это было, но однажды он сработал там, где первое решение, предложенное здесь, потерпело неудачу.
# 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(...