Ошибка Django Ajax "FORBIDDEN"
Я видел случаи, когда люди получают запрещенные ошибки при попытке сделать удаленные запросы Ajax, но я делаю локальный запрос, и у меня также включен CSRF в моем промежуточном программном обеспечении.
errorThrown возвращает "Запрещено"
Я думаю, что проблема может заключаться в том, что я пытаюсь отправить это в обычное представление (текущая страница)... Я не уверен, что мой препроцессор возвращается в представление, чтобы повторно отобразить страницу. или если он вернется обратно на мою текущую страницу. (не думаю, что я это очень хорошо объяснил)
Надеюсь, это даст вам достаточно хорошую картину того, что происходит. Любая/вся помощь приветствуется.
.ajax:
jQuery.ajax({
type: "POST",
dataType: "json",
data: dataString,
success: function(json) {
jQuery(".signup").attr('disabled', false);
$('.success').show();
console.log(json.message);
},
error: function(jqXHR, textStatus, errorThrown) {
jQuery(".signup").attr('disabled', false);
$('.fail').show().append(errorThrown);
console.log(textStatus);
}
});
Ответы
Ответ 1
Вам нужен токен CSRF, даже если запрос относится к одному домену. Там код здесь, чтобы добавить токен CSRF в ваши запросы AJAX (с помощью jQuery):
https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/#ajax
Эта ссылка указывает на версию 1.7, если вы используете другую версию Django, вы можете выбрать свою версию из меню float в правом нижнем углу.
Ответ 2
Вы получите 403 ошибки, если у вас включен csrf, попробуйте добавить views.py
, чтобы узнать, вызывает ли это это:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
view class/method
Ответ 3
Хорошо, если вы все еще хотите защитить CSRF, прочитайте мое решение.
В моем случае у меня есть шаблон, в котором я не хочу иметь элемент <form></form>
. Но я все еще хочу сделать запросы AJAX POST с помощью jQuery.
Я получил 403 ошибки из-за того, что cookie CSRF был нулевым, даже если я следил за django docs (https://docs.djangoproject.com/en/1.5/ref/contrib/csrf/). Решение находится на одной странице с упоминанием декоратора ensure_csrf_cookie
.
Мой CSRF файл cookie был установлен, когда я добавил это вверху моего views.py
:
from django.views.decorators.csrf import ensure_csrf_cookie
@ensure_csrf_cookie
Также обратите внимание, что в этом случае вам не нужен элемент DOM в вашей разметке/шаблоне: {% csrf_token %}
Ответ 4
Загрузите jQuery.Cookie и включите его, отсюда: http://plugins.jquery.com/cookie/
Затем добавьте функцию beforeSend
и отправьте токен csrf следующим образом:
jQuery.ajax({
type: "POST",
dataType: "json",
data: dataString,
beforeSend: function(xhr, settings) {
xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken'));
},
success: function(json) {
jQuery(".signup").attr('disabled', false);
$('.success').show();
console.log(json.message);
},
error: function(jqXHR, textStatus, errorThrown) {
jQuery(".signup").attr('disabled', false);
$('.fail').show().append(errorThrown);
console.log(textStatus);
}
});