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

Django自定义请求头触发CORS错误并自动调用OPTIONS方法求助

问题范畴与修复方案

问题归属

这属于后端CORS配置范畴。原因是:当前端请求包含自定义请求头时,浏览器会自动发送OPTIONS预检请求,验证后端是否允许该自定义头;只有后端正确响应预检请求,浏览器才会发送实际的业务请求。Postman不会触发浏览器的CORS预检机制,因此测试正常,但浏览器会严格遵循CORS规范执行预检,所以问题出在后端对预检请求的响应配置上。

修复步骤

1. 明确配置允许的自定义请求头

不要使用Access-Control-Allow-Headers: *,因为CORS规范中,*仅对简单请求有效,对于触发预检的请求(含自定义头的请求属于此类),必须明确列出允许的请求头。在Django的settings.py中修改配置:

CORS_ALLOW_HEADERS = [
    'accept',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
    'x-custom-header',  # 替换成你的自定义请求头名称,多个就逐一添加
]

2. 确保CORS中间件顺序正确

corsheaders.middleware.CorsMiddleware必须放在django.middleware.common.CommonMiddleware之前,保证CORS响应头能被正确添加。修改settings.py中的MIDDLEWARE列表:

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 其他中间件按原有顺序排列
]

3. 可选:配置预检请求缓存时长

设置CORS_PREFLIGHT_MAX_AGE可以缓存预检请求的响应结果,减少浏览器发送OPTIONS请求的次数,优化性能:

CORS_PREFLIGHT_MAX_AGE = 86400  # 缓存1天,单位为秒

4. 检查其他中间件是否拦截OPTIONS请求

如果项目中存在安全类中间件(如自定义权限中间件),需确保它们不会拦截OPTIONS请求。可以在中间件的process_request或process_view方法中,判断请求方法为OPTIONS时直接放行,避免拦截。

内容的提问来源于stack exchange,提问作者Arun Mangatt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:05:15