我想在不使用Django中的表单元素的情况下发送ajax请求(通过Jquery,尽管我认为这种情况无关紧要)。根据{{3}},我应该可以使用ensure_csrf_cookie
装饰器来做到这一点,但是,我得到Error was: cannot import name ensure_csrf_cookie
。
我正在使用以下导入from django.views.decorators.csrf import ensure_csrf_cookie
。
我没有找到关于ensure_csrf_cookie
的大量文档,因此非常感谢任何帮助。
顺便说一句,使用@csrf_exempt
按预期工作。
提前致谢。
答案 0 :(得分:8)
ensure_csrf_cookie
可能只是一个1.4 alpha的功能 - 我可以在主干上使用相同的语句将其导入。
这里最简单的解决方案是在ajax调用中传递csrf_token VALUE。
你说你使用的是jQuery。
$.ajax({
url: "",
type: 'POST',
data: {
csrfmiddlewaretoken: '{{ csrf_token }}' // just the token value
},
success: function(response) {
}
})
看来这个ensure_csrf_cookie
强制视图设置csrf cookie,这个cookie在基于自动cookie的csrf保护机制中用于此处描述的jquery ajax调用:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax
答案 1 :(得分:1)
你是对的 - 这似乎是文档中的错误。您应该可以使用csrf_exempt(相同的文档页面)。
答案 2 :(得分:0)
如果您可以访问Django标签,则Yuji的答案将非常有效。如果在您的页面中,您已经有一个使用标签的表单(因此它具有包含CSRF的隐藏输入字段),则可以使用:
var formData = new FormData();
formData.append("csrfmiddlewaretoken", $('input[name=csrfmiddlewaretoken]').val());
$.ajax({
url: "",
type: "POST",
data: formData,
processData: false,
contentType: false,
success: function() {
...
},