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
相关产品推荐
相关产品推荐

