You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Django Rest Framework中POST请求需将CSRF令牌置于请求体而非请求头?

Django Rest Framework中CSRF令牌不同位置的原因
  • 源于Django原生CSRF机制的设计
    Django的CSRF防护最初是为传统表单提交场景打造的。当你用Django模板生成表单时,框架会自动插入一个名为csrfmiddlewaretoken的隐藏输入字段,表单以POST方式提交时,这个字段会随请求体一起发送,Django的CSRF中间件默认会从请求体读取这个键来验证令牌。DRF作为Django的扩展,继承了这个行为,所以表单式的POST提交必须遵循这个规则。

  • 适配AJAX请求的场景
    对于PUT、DELETE这类非POST请求,开发者通常用AJAX发送。AJAX请求在请求头里添加字段比构造表单数据放入请求体更便捷,而且前端框架也更容易实现从Cookie中读取CSRF令牌后放到请求头里。Django的CSRF中间件后续适配了这种场景,支持从X-CSRFToken请求头读取令牌,DRF自然沿用了这个适配方案,所以这类请求用请求头的方式成了常规做法。

  • 两种方式其实兼容
    其实DRF并没有强制POST请求只能用请求体的csrfmiddlewaretoken——如果用AJAX发送POST请求,把令牌放在X-CSRFToken请求头里同样有效。只是传统表单提交的POST只能用请求体方式,大家慢慢把这种情况作为POST的默认做法,非POST请求统一用请求头,这样区分开更清晰。

内容的提问来源于stack exchange,提问作者rsommerard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 19:10:59