Django API POST请求遇CSRF缺失错误,如何无需CSRF验证提交?
解决Django API接收JS POST请求时的CSRF缺失错误
核心原因
Postman能正常提交是因为它不会自动携带Django会话相关的Cookie,而Django的CSRF中间件仅在请求包含会话Cookie时才会强制验证CSRF Token;浏览器的fetch请求默认会携带Cookie,因此触发了CSRF校验,导致报错。
解决方案(无需CSRF验证的场景)
1. 给目标视图添加CSRF豁免装饰器(推荐)
这是最安全的方式,仅对需要的API关闭CSRF验证,不影响其他视图的安全性。
若使用Django REST Framework类视图:
from django.views.decorators.csrf import csrf_exempt from django.utils.decorators import method_decorator from rest_framework.views import APIView from rest_framework.response import Response @method_decorator(csrf_exempt, name='dispatch') class PostCustomerView(APIView): def post(self, request): # 你的业务处理逻辑 return Response({"status": "success"})
若使用普通Django函数视图:
from django.views.decorators.csrf import csrf_exempt from django.http import JsonResponse @csrf_exempt def post_customer(request): if request.method == 'POST': # 解析请求数据并处理 return JsonResponse({"status": "success"})
2. 全局关闭CSRF中间件(不推荐)
仅适用于纯API服务、无用户会话交互的场景,会降低整个项目的安全性。在项目的settings.py中注释掉CSRF中间件:
MIDDLEWARE = [ # 'django.middleware.csrf.CsrfViewMiddleware', # 注释这一行 # 其他中间件... ]
额外说明
如果后续需要开启CSRF验证,也可以在JS的fetch请求中携带CSRF Token:
- 从页面的Cookie中获取
csrftoken值 - 在请求头中添加
X-CSRFToken: 你的token值
但根据你的需求,优先使用前两种豁免CSRF验证的方案即可。
内容的提问来源于stack exchange,提问作者hossein ghodrati
相关产品推荐
相关产品推荐

