Jquery и Django CSRF Token - PullRequest
       2

Jquery и Django CSRF Token

22 голосов
/ 23 декабря 2011

У меня есть 2 страницы HTML.

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

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

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

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

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

Приветствия

Ответы [ 3 ]

34 голосов
/ 23 декабря 2011

Вы не передаете токен csrf с POST . Попробуйте сделать то, что я сделал в data . То есть получить токен csrf (или ваш собственный метод) и передать его в аргументах.

$.ajax({
    url : url,
    type: "POST",
    data : {csrfmiddlewaretoken: document.getElementsByName('csrfmiddlewaretoken')[0].value},
    dataType : "json",
    success: function( data ){
        // do something
    }
});
11 голосов
/ 07 апреля 2016

Если вы отправляете тело запроса 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);
  });
}
7 голосов
/ 15 апреля 2015

Из документов на CSRF и AJAX:

Маркер CSRF также присутствует в DOM, но только если он явно включен с использованием csrf_token в шаблон.Файл cookie содержит канонический токен;CsrfViewMiddleware предпочтет куки-файл токену в 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');

Или любой другой способ взаимодействия с файлами cookie.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...