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

Ошибка 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);
        }

    });
4b9b3361

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

});