在 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 中返回模型表单集并在模板中使用
在 Bootstrap Modal 中使用 django 清晰表单的 AJAX 反馈表单