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() { ... },
});