Джанго Аякс "ЗАПРЕЩЕНО" ошибка - PullRequest
16 голосов
/ 30 мая 2011

Я видел случаи, когда люди получали запрещенные ошибки при попытке сделать удаленные запросы 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);
        }

    });

Ответы [ 4 ]

20 голосов
/ 30 мая 2011

Вам нужен токен CSRF, даже если запрос находится в том же домене. Здесь есть код для добавления токена CSRF к вашим AJAX-запросам (с jQuery):

https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/#ajax

Эта ссылка указывает на версию 1.7. Если вы используете другую версию Django, вы можете выбрать свою версию из всплывающего меню в правом нижнем углу.

9 голосов
/ 30 мая 2011

Если у вас есть csrf, вы получите 403 ошибки, попробуйте добавить views.py, чтобы узнать, не является ли это причиной:

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
view class/method
1 голос
/ 17 октября 2016

Загрузите 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);
    }

});
1 голос
/ 10 июля 2013

Ну, если вам все еще нужна защита от CSRF, прочитайте мое решение.

В моем случае у меня есть шаблон, в котором я не хочу иметь элемент <form></form>.Но я все еще хочу делать запросы AJAX POST, используя jQuery.

Я получил 403 ошибки, из-за того, что файл cookie CSRF имеет значение null, даже если я следовал документации django (https://docs.djangoproject.com/en/1.5/ref/contrib/csrf/). Решение в том жестраница с упоминанием декоратора ensure_csrf_cookie.

Мой файл CSRF действительно был установлен, когда я добавил его в начало моего views.py:

from django.views.decorators.csrf import ensure_csrf_cookie
@ensure_csrf_cookie

Кроме того, обратите внимание, что в этомна случай, если вам не понадобится элемент DOM в вашей разметке / шаблоне: {% csrf_token %}

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