我一直在寻找几天如何使用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的回复的快速评论。我真的不明白。
有谁能解释为什么最简单的解决方案不是最好的,并提供一些实际的例子?
由于
答案 0 :(得分:1)
这两种解决方案实际上是完全相同的。在请求中将csrftoken
提供给Django。他们只是以不同的方式做到这一点。
'更简单'选项
对于Django模板中的单个jQuery调用,使用{{ csrf_token }}
标记添加到帖子数据可能更简单。但是,只要多个地方有多个电话,就很难维护。
jQuery代码
另一方面,jQuery代码:
工作原理
jQuery代码的额外复杂性是由于它在浏览器中运行,无法访问任何Django变量。
代码通过附加到用于每个Ajax调用的jQuery事件来工作。它从存储在浏览器中的cookie中查找csrftoken
,根据请求类型和主机确定是否发送令牌,并将令牌发送为HTTP header
,而不是将其包含在{ {1}}数据。