Подтвердить что ты не робот

JQuery и Jango CSRF Token

У меня есть 2 html Pages.

Родительская страница и детская страница. Страница "Ребенок" содержит кнопку "Отправить", которая запускает код на родительской странице для отправки сообщения Ajax.

Я загружаю дочернюю страницу с помощью метода $.load(), а затем, когда нажимается кнопка, она запускает метод $.ajax.POST. Этот метод post передает только код JSON в код Python.

Когда я делаю это в любом браузере, кроме IE, он отлично работает. Однако, когда я запускаю этот код в IE. Я получаю ошибки Python/Django о токенах CSRF.

Я думаю, причина в том, что дочерняя страница - это просто обновление самой текущей страницы с запущенным кодом сервера.

Кто-нибудь знает, как мне нужно заставить это работать.

Приветствия,

4b9b3361

Ответ 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);
  });
}