在没有表单元素的Django中使用ajax请求

时间:2011-11-05 04:41:56

标签: ajax django decorator

我想在不使用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按预期工作。

提前致谢。

3 个答案:

答案 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() {
            ...
        },