【问题标题】:Using ajax request in Django without form element在没有表单元素的Django中使用ajax请求
【发布时间】:2011-12-22 12:36:21
【问题描述】:

我想发送一个 ajax 请求(通过 Jquery,尽管我认为在这种情况下这无关紧要),而不在 Django 中使用表单元素。根据documentation,我应该可以通过使用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 可以按预期工作。

提前致谢。

【问题讨论】:

    标签: ajax django decorator


    【解决方案1】:

    ensure_csrf_cookie 可能只是 1.4 Alpha 版功能,如果您在导入时遇到问题 - 我可以使用 trunk 上的相同语句导入它。

    这里最简单的解决方案是在 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,这是在此处描述的 jquery ajax 调用的基于自动 cookie 的 csrf 保护机制中使用所需的:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax

    【讨论】:

    • 我不知道 'ensure_csrf_cookie' 是 1.4 alpha 功能。这就是为什么我收到导入错误(我正在运行 1.3)。至于你的建议,我的 javascript 没有嵌入到我的模板中,所以 {{ csrf_token }} 不会被实际令牌替换。您对此有解决方法吗?
    • 是的,在这里实现 jQuery 函数:docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax,其中带有 csrf_token 的 cookie 放置在客户端浏览器上。如果没有这个新的 1.4 功能,它应该在大多数情况下都可以工作?
    • 太棒了。我有点犹豫要不要使用这种方法,因为它看起来很丑,但效果很好。顺便说一句,我应该尽可能避免使用“csrf_exempt”,还是使用 ensure_csrf_cookie 或您刚才建议的选项也有缺点(安全方面)?
    【解决方案2】:

    你是对的 - 这似乎是文档中的一个错误。您应该可以改用csrf_exempt(相同的文档页面)。

    【讨论】:

    • 如果 ensure_csrf_cookie 是 1.4 alpha 功能(如 Yuji 所建议的),那么文档只需要澄清这一点。是的,csrf_except 有效,但 ensure_csrf_cookie 看起来是完成这项工作的更好工具。
    • 是的,它不在 1.3 的文档中:docs.djangoproject.com/en/1.3/ref/contrib/csrf/…
    • 确实如此。 /dev/ 与 /1.3/。我应该更加小心。
    【解决方案3】:

    如果您可以访问 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() {
                ...
            },
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-18
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 2012-06-05
      相关资源
      最近更新 更多