我一直在寻找几天如何使用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:'{}'
但这似乎太好了,如果那很容易,为什么我们需要从django网站复制长片?还有一个关于静态JS的回复的快速评论 . 我真的不明白 .
有谁能解释为什么最简单的解决方案不是最好的,并提供一些实际的例子?
谢谢
1 回答
这两种解决方案实际上完全相同 . 在请求中将
csrftoken
提供给Django . 他们只是以不同的方式做到这一点 .'Simpler' option
对于Django模板中的单个jQuery调用,使用
{{ csrf_token }}
标记添加到post数据可能更简单 . 但是,只要多个地方有多个呼叫,就很难维护 .jQuery Code
另一方面,jQuery代码:
可以包含在静态.js文件中的一个位置
不需要在django模板中
可以包含在多个页面中
适用于所有jQuery Ajax调用,无需修改单个调用
包括使用任何第三方jQuery库
到处都是一样的,所以很容易在Django文档中分享
How it works
jQuery代码的额外复杂性是由于它在浏览器中运行,无法访问任何Django变量 .
该代码通过附加到用于每个Ajax调用的jQuery事件来工作 . 它从存储在浏览器中的cookie中查找
csrftoken
,根据请求类型和主机确定是否发送令牌,并将令牌发送为HTTP header
,而不是将其包含在POST
数据中 .