为何我的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
相关产品推荐
相关产品推荐

