0

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

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

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

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

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

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

谢谢

4

1 回答 1

1

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

“更简单”的选项

对于 Django 模板中的单个 jQuery 调用,使用{{ csrf_token }}标签添加到 post 数据可能更简单。但是,一旦在多个地方有多个调用,就变得更难维护。

jQuery 代码

另一方面,jQuery 代码:

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

这个怎么运作

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

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

于 2012-05-15T04:12:29.893 回答