Django Rest Framework接收POST请求返回403 Forbidden错误如何解决
403错误定位及解决方案
排查第一步
先查看Django运行时的终端日志,403错误会附带具体原因描述(比如CSRF验证失败、权限不足),可以快速锁定问题根源。
常见问题及对应解决方法
问题1:CSRF校验失败
Django默认开启了CsrfViewMiddleware中间件,所有POST请求必须携带合法的CSRF Token,你的前端请求未携带该参数时就会触发403。
可选解决方案2选1即可:
- 方案1:前端适配携带CSRF Token
在axios全局配置中添加如下规则:
// 配置csrf读取规则 axios.defaults.xsrfCookieName = 'csrftoken' axios.defaults.xsrfHeaderName = 'X-CSRFToken' // 跨域场景下需额外开启凭证传递 axios.defaults.withCredentials = true
同时在Django settings.py中添加配置:
CORS_ALLOW_CREDENTIALS = True
- 方案2:公开接口豁免CSRF校验
如果该接口不需要做CSRF防护,给视图添加豁免装饰器:
from django.views.decorators.csrf import csrf_exempt @api_view(['GET', 'POST']) @csrf_exempt def products(request): # 原有视图逻辑保持不变
问题2:DRF权限限制
如果DRF全局默认配置了IsAuthenticated权限类,未登录用户的请求会被直接拦截返回403。
解决方案:
给对应视图添加公开权限装饰器即可:
from rest_framework.permissions import AllowAny from rest_framework.decorators import permission_classes @api_view(['GET', 'POST']) @permission_classes([AllowAny]) def products(request): # 原有视图逻辑保持不变
如果需要全局开放所有接口权限,在settings.py中添加如下配置:
REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.AllowAny', ] }
问题3:基础配置错误
- 你的settings.py中
ALLOWED_HOSTS为空数组,本地开发需要修改为ALLOWED_HOSTS = ['*'],或者手动添加后端运行的域名/IP - 如果你没有配置React代理转发,前端直接发
/products请求会默认请求前端运行的3000端口,而非后端8000端口,需要改为完整请求地址http://localhost:8000/products,或者配置React代理规则转发接口请求到后端端口。
内容的提问来源于stack exchange,提问作者Omar Alhussani
相关产品推荐
相关产品推荐

