Django Ajax“FORBIDDEN”错误

时间:2011-05-30 15:18:53

标签: python ajax django json

我已经看到人们在尝试发出远程Ajax请求时遇到禁止错误的情况,但我正在发出本地请求,并且我的中间件也启用了CSRF。

errorThrown返回“Forbidden”

我认为问题可能是我正在尝试将其发送到正常视图(当前页面)...我不确定我的预处理器是否返回到视图以重新呈现页面..或者它是否正在返回当前页面。 (不要以为我解释得那么好)

希望这能为您提供足够好的照片。感谢任何/所有帮助。

.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 个答案:

答案 0 :(得分:20)

即使请求属于同一个域,您也需要CSRF令牌。这里有代码为您的AJAX请求添加CSRF令牌(使用jQuery):

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

此链接指向1.7版,如果您使用的是不同版本的Django,您可以从右下方的浮动菜单中选择您的版本。

答案 1 :(得分:9)

如果您打开csrf,您将收到403错误,请尝试添加views.py以查看是否导致错误:

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
view class/method

答案 2 :(得分:1)

好吧,如果您仍想要CSRF保护,请阅读我的解决方案。

在我的情况下,我有一个模板,其中我不想拥有<form></form>元素。但是我仍然希望使用jQuery来发出AJAX POST请求。

我有403错误,因为CSRF cookie为空,即使我遵循了django文档(https://docs.djangoproject.com/en/1.5/ref/contrib/csrf/)。解决方案在同一页面中,提到ensure_csrf_cookie装饰器。

我在我的views.py

的顶部添加了这个CSRF Coo​​kie
from django.views.decorators.csrf import ensure_csrf_cookie
@ensure_csrf_cookie

此外,请注意,在这种情况下,您不需要标记/模板中的DOM元素:{% csrf_token %}

答案 3 :(得分:1)

从这里下载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);
    }

});