在 django 中使用 ajax 表单发布 csrf 令牌的这种方法有啥问题?

Posted

技术标签:

【中文标题】在 django 中使用 ajax 表单发布 csrf 令牌的这种方法有啥问题?【英文标题】:what's wrong with this method for csrf token with ajax form post in django?在 django 中使用 ajax 表单发布 csrf 令牌的这种方法有什么问题? 【发布时间】:2012-05-22 13:12:39 【问题描述】:

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

我通过添加在这里找到的 javascript sn-p 解决了这个问题: https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax

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

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

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

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

谢谢

【问题讨论】:

【参考方案1】:

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

“更简单”选项

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

jQuery 代码

另一方面,jQuery 代码:

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

工作原理

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

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

【讨论】:

以上是关于在 django 中使用 ajax 表单发布 csrf 令牌的这种方法有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中返回 AJAX 请求的表单错误

Django:如何在 ajax 中返回模型表单集并在模板中使用

在 Bootstrap Modal 中使用 django 清晰表单的 AJAX 反馈表单

使用 Django 实现 ajax 表单

使用 django ajax jquery 提交一个文件不起作用的表单

如何在html中检索Django表单对象以便以后使用AJAX