Django中DELETE请求出现CORS方法未找到问题(预检请求异常)
Django DELETE请求CORS错误排查与解决方案
先确认OPTIONS预检请求的真实响应头
浏览器Network标签显示的可能是DELETE请求的头,而非预检的OPTIONS请求头。直接复制OPTIONS请求为cURL在终端执行,看实际返回的头:curl -X OPTIONS -H "Origin: 你的前端域名" -H "Access-Control-Request-Method: DELETE" 你的API地址 -v如果OPTIONS响应里确实没有
Access-Control-Allow-Methods,说明corsheaders没正确处理预检。强制调整中间件顺序
把corsheaders.middleware.CorsMiddleware放到所有中间件最前面,尤其是django.middleware.common.CommonMiddleware之前,settings.py里的配置要像这样:MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', # 其他中间件... ]中间件顺序错了,corsheaders根本没机会处理请求头。
放弃用
*,显式指定允许的方法
部分浏览器对Access-Control-Allow-Methods: *的预检支持有问题,直接在settings.py里写死允许的方法:CORS_ALLOW_METHODS = [ 'DELETE', 'GET', 'OPTIONS', 'PATCH', 'POST', 'PUT', ]检查反向代理是否篡改了响应头
比如Nginx这类代理,如果自己加了Access-Control-Allow-Methods头,会和Django返回的头冲突。确保代理配置里不手动添加CORS相关头,完全让Django处理。示例Nginx配置:proxy_pass http://你的Django后端地址; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 不要加任何Access-Control相关的set_header配置排查自定义中间件
如果项目里有自定义中间件,检查是否在process_request里提前返回了OPTIONS请求的响应,导致corsheaders没机会处理。确保OPTIONS请求能完整走到corsheaders中间件。
内容的提问来源于stack exchange,提问作者Spencer
相关产品推荐
相关产品推荐

