JQuery и Jango CSRF Token
У меня есть 2 html Pages.
Родительская страница и детская страница. Страница "Ребенок" содержит кнопку "Отправить", которая запускает код на родительской странице для отправки сообщения Ajax.
Я загружаю дочернюю страницу с помощью метода $.load(), а затем, когда нажимается кнопка, она запускает метод $.ajax.POST. Этот метод post передает только код JSON в код Python.
Когда я делаю это в любом браузере, кроме IE, он отлично работает. Однако, когда я запускаю этот код в IE. Я получаю ошибки Python/Django о токенах CSRF.
Я думаю, причина в том, что дочерняя страница - это просто обновление самой текущей страницы с запущенным кодом сервера.
Кто-нибудь знает, как мне нужно заставить это работать.
Приветствия,
Ответы
Ответ 1
Вы не передаете токен csrf с POST. Попытайтесь сделать то, что я сделал в данных. То есть для получения токена csrf (или вашего собственного метода) и передачи его в ваших аргументах.
$.ajax({
url : url,
type: "POST",
data : {csrfmiddlewaretoken: document.getElementsByName('csrfmiddlewaretoken')[0].value},
dataType : "json",
success: function( data ){
// do something
}
});
Ответ 2
Из docs на CSRF и AJAX:
Маркер CSRF также присутствует в DOM, но только если он явно включен с использованием csrf_token в шаблоне. Файл cookie содержит канонический токен; CsrfViewMiddleware предпочтет cookie для токена в DOM. Несмотря на это, у вас гарантированно будет файл cookie, если токен присутствует в DOM, поэтому вы должны использовать cookie!
Пример (также из документов)
// using jQuery
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('csrftoken');
Или можно использовать любой другой способ взаимодействия с кукисами.
Ответ 3
Если вы отправляете тело запроса POST, возможно, проще добавить токен csrf в качестве заголовка запроса. Я считаю, что этот подход легче читать, поскольку он не загромождает тело запроса с помощью токена. Большинство запросов AJAX отправят токен csrf в виде заголовка, как это было предложено в документации Django.
function startTest(testId) {
var payload = JSON.stringify({
test_id : testId
});
$.ajax({
url: "/test-service/",
method: "POST",
headers: {'X-CSRFToken': '{{ csrf_token }}'},
data: payload,
dataType: "json"
}).done(function(response) {
console.log(response.id + " " + response.name);
}).fail(function (error) {
console.log(error);
});
}