首页 文章

这个方法对于django中带有ajax表单的csrf令牌有什么问题?

提问于
浏览
0

我一直在寻找几天如何使用jquery将表单提交转换为ajax,而csrf令牌问题令我感到困惑 .

我通过添加此处找到的javascript代码段解决了该问题:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax

但是当遇到stackoverflow时,我发现更简单的答案(不是第一个):Django CSRF check failing with an Ajax POST request

一些答案建议只需将以下内容添加到帖子数据中:csrfmiddlewaretoken:'{}'

但这似乎太好了,如果那很容易,为什么我们需要从django网站复制长片?还有一个关于静态JS的回复的快速评论 . 我真的不明白 .

有谁能解释为什么最简单的解决方案不是最好的,并提供一些实际的例子?

谢谢

1 回答

  • 1

    这两种解决方案实际上完全相同 . 在请求中将 csrftoken 提供给Django . 他们只是以不同的方式做到这一点 .

    'Simpler' option

    对于Django模板中的单个jQuery调用,使用 {{ csrf_token }} 标记添加到post数据可能更简单 . 但是,只要多个地方有多个呼叫,就很难维护 .

    jQuery Code

    另一方面,jQuery代码:

    • 可以包含在静态.js文件中的一个位置

    • 不需要在django模板中

    • 可以包含在多个页面中

    • 适用于所有jQuery Ajax调用,无需修改单个调用

    • 包括使用任何第三方jQuery库

    • 到处都是一样的,所以很容易在Django文档中分享

    How it works

    jQuery代码的额外复杂性是由于它在浏览器中运行,无法访问任何Django变量 .

    该代码通过附加到用于每个Ajax调用的jQuery事件来工作 . 它从存储在浏览器中的cookie中查找 csrftoken ,根据请求类型和主机确定是否发送令牌,并将令牌发送为 HTTP header ,而不是将其包含在 POST 数据中 .

相关问题