配置django-cors-headers后仍遇403错误,非DRF项目该如何解决?
问题解答
首先明确:django-cors-headers并非仅适用于DRF,它是独立于DRF的Django通用中间件,所有Django项目都能正常使用。
你的403错误大概率来自以下几个配置问题:
1. 中间件顺序错误
corsheaders.middleware.CorsMiddleware的位置必须尽可能靠前,官方要求它要放在django.middleware.common.CommonMiddleware之前,且要在任何可能修改响应的中间件之前。你的配置里把它放在了CsrfViewMiddleware之后,这会导致CORS头无法正确生成。
正确的中间件顺序应该是:
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'corsheaders.middleware.CorsMiddleware', # 调整到这个位置 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
2. CORS_ALLOWED_ORIGINS配置不匹配
如果你的前端运行在非http://localhost:8000的地址(比如常见的http://localhost:3000、http://127.0.0.1:5173等),当前的CORS_ALLOWED_ORIGINS列表没有包含前端的源地址,就会触发CORS相关的403。
请将前端实际的访问地址加入列表:
CORS_ALLOWED_ORIGINS = [ 'http://localhost:8000', 'http://localhost:3000', # 替换成你的前端实际地址 ]
3. CSRF校验导致的403
如果你的请求是POST/PUT/DELETE等非GET请求,Django默认会强制校验CSRF Token,即使配置了CORS也不会绕过这个校验。如果前端没有正确传递CSRF Token,就会返回403。
解决方式:
- 给不需要CSRF保护的视图添加
@csrf_exempt装饰器(注意安全风险,仅适用于公开接口) - 配置
CSRF_TRUSTED_ORIGINS,将前端源地址加入信任列表,同时前端正确获取并传递CSRF Token:
CSRF_TRUSTED_ORIGINS = [ 'http://localhost:3000', # 替换成你的前端地址 ]
内容的提问来源于stack exchange,提问作者Franz Genegobis
相关产品推荐
相关产品推荐

