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

为何我的DRF视图无需CSRF Token即可接收POST请求?

DRF视图无需CSRF Token的原因

核心差异来自DRF与标准Django视图对CSRF保护场景的判断逻辑不同:

  • DRF默认豁免非会话认证请求的CSRF检查
    DRF是为API服务设计的,这类服务通常用Token、JWT等无状态认证方式,而非Django传统的会话Cookie认证。CSRF攻击的核心是利用浏览器自动携带会话Cookie的特性,而API请求一般不依赖浏览器自动传Cookie,所以DRF默认对这类请求跳过CSRF验证。

  • DRF会根据请求内容类型自动识别场景
    你用fetch发送的是application/json类型的请求,DRF会判定这是API请求,而非浏览器表单提交的请求(表单默认是application/x-www-form-urlencoded),因此不会强制要求CSRF Token。

  • 标准Django视图的默认规则
    标准Django视图默认遵循全局CSRF中间件的规则,所有修改类请求(POST/PUT/DELETE等)都必须携带CSRF Token,不管请求内容类型——因为它默认面向浏览器表单提交的场景,需要严格防范CSRF攻击。

补充:如果你的DRF视图使用了Django会话认证(比如用户登录后依赖Session),那此时发送POST请求就必须携带CSRF Token了,DRF会自动启用CSRF检查。

你的请求代码(标准Django视图场景):

fetch("http://127.0.0.1:8000/api/add_item/", {
    method: "POST",
    headers: {
        "Content-Type": "application/json"
        // "X-CSRFToken": Cookies.get("csrftoken")
    },
    body: JSON.stringify({ content: value })
})

DRF视图代码:

@api_view(['POST'])
def add_item(request):
    serializer = ToDoSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 04:18:14