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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:36:07