我已经看到人们在尝试发出远程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);
}
});
答案 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
:
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);
}
});