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

时间:2012-05-15 03:18:00

标签: ajax django csrf

我一直在寻找几天如何使用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:'{{csrf_token}}'

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

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

由于

1 个答案:

答案 0 :(得分:1)

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

'更简单'选项

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

jQuery代码

另一方面,jQuery代码:

  • 可以包含在静态.js文件中的一个位置
  • 不需要在django模板中
  • 可以包含在多个页面中
  • 适用于所有jQuery Ajax调用,无需修改单个调用
  • 包括使用任何第三方jQuery库
  • 无处不在,所以很容易在Django文档中分享

工作原理

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

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