【问题标题】:Sending a jQuery POST to a Django View将 jQuery POST 发送到 Django 视图
【发布时间】:2013-04-07 06:39:04
【问题描述】:

我通过 $.ajax() 从 HTTP 上的页面向 Django 视图发送 POST 请求 - 我使用 AJAX sn-p for CSRF 提供 here。我可以在 Firebug 中将 csrftoken cookie 视为Secure;我想这就是为什么 POST 请求的 X-Csrftoken 标头作为 null 发送的原因。

有什么方法可以让我真正访问这个 cookie 的值吗?我目前正在通过在我的视图中添加@csrf_exempt 来绕过403 错误(因为POST 发送时带有一个空的CSRF 令牌标头)-但希望有一个适当的CSRF 方法。

澄清更新:通过表单提交此数据。我只是在页面上加载 javascript 文件(包含 AJAX 调用)时发送 POST。

【问题讨论】:

    标签: jquery python ajax django csrf


    【解决方案1】:

    我为获得适当的 csrf 解决方案所做的是:

    将我的{% csrf_token %} 包含在有意义的地方。

    var csrfToken = $('input[name="csrfmiddlewaretoken"]').val();
    $.ajax({
        url: $form.attr('action'),
        type: 'POST',
        data: postData,
        csrfmiddlewaretoken: csrfToken,
        dataType: 'json',
        success: function(data) { }
    });
    

    我一直在努力让这个工作:

    var csrftoken = $.cookie('csrftoken');
    $.ajaxSetup({
        beforeSend: function(xhr, settings) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    });
    

    但到目前为止,第一个解决方案已被证明是最有效的解决方案。

    【讨论】:

    • 在您的示例中,csrfmiddlewaretoken 是表单中的隐藏字段。但是,在我的情况下,我在页面加载时发送这个 POST 请求(一旦加载包含 $.ajax() 的 JS 就调用) - 即没有表单。我该怎么办?
    • 如果我对您的理解正确,那么您必须在“之前”视图中呈现一个 csrf_token 并将其与“GET”请求一起发送。或者,如果这对您来说不可能,您可以使用在您的请求中“注入”csrf_token 的中间件。
    • 是的,csrf_token 已经可用。我刚刚尝试将 csrfmiddlewaretoken 添加到 AJAX 调用中,如您的第一个示例所示,它有效!这有记录吗?
    • @GPX 是的,它有一些记录。 docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-it-works 的 Bullet #2 涵盖了它,但没有像我一样将它包含在 jquery 调用的 ajax 中。
    猜你喜欢
    • 2016-08-03
    • 2023-04-09
    • 2012-04-15
    • 2013-02-20
    • 1970-01-01
    • 2014-02-06
    • 2018-04-05
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多