Ajax, CSRF и DELETE

Я использую функцию getCookie из документации django чтобы получить значение csrfmiddlewaretoken.

У меня есть следующий вызов ajax:

var url = reverse_removeprofile.replace(/deadbeef/, key);
$.ajax({
    type:          "DELETE",
    url:           url,
    data:          "csrfmiddlewaretoken=" + getCookie("csrftoken"),
    success:       function() { ... },
});

Когда этот код выполняется, django вызывает исключение 403, которое говорит мне, что проверка CSRF не удалась. Однако, если я изменю type от DELETE до POST тогда django будет рад этому и не будет жаловаться вообще.

Я действительно не смог найти что-то полезное в Google об этом, но я нашел этот (теперь закрытый и исправленный) билет: https://code.djangoproject.com/ticket/15258

Если я правильно понял, то эта проблема была исправлена в 1.4-м вехе. Я использую django 1.4, но все же я не могу проверить токен CSRF с запросом DELETE.

Я что-то упустил?

Ответ 1

Это похоже на ошибку jQuery, вызванную некоторой путаницей в отношении того, должны ли данные DELETE быть прикреплены к URL-адресу (например, запрос GET) или тело запроса (например, POST)

См. Отчет об ошибке.

Вы можете обойти это, используя альтернативный метод CSRF для вызовов AJAX, установив заголовок X-CSRFToken в запросе. Попробуйте изменить вызов AJAX, чтобы выглядеть так:

$.ajax({
    type: "DELETE",
    url: url,
    beforeSend: function(xhr) {
        xhr.setRequestHeader("X-CSRFToken", getCookie("csrftoken"));
    }
    success: function() { ... },
});