部署Django+Netlify项目时上传表单遇CORS问题求助
问题说明
部署后上传功能触发CORS错误,本地Docker环境完全正常,错误信息如下:
Access to XMLHttpRequest at 'https://domain/dj-rest-auth/user/' from origin 'https://domain' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
patch https://domain/dj-rest-auth/user/ net::ERR_FAILED 400
排查步骤
一、先确认后端CORS配置是否真的生效
别只盯着CORS_ORIGIN_ALLOW_ALL = True,把django-cors-headers的配置拉满检查:
- 确认
corsheaders在INSTALLED_APPS中注册 corsheaders.middleware.CorsMiddleware必须放在MIDDLEWARE最前面(至少在django.middleware.common.CommonMiddleware之前)- 加上
CORS_ALLOW_CREDENTIALS = True(你前端开了withCredentials: true,这个必须配套配置) - 如果后端用了反向代理(比如Nginx),检查代理是否原封不动传递Django返回的CORS头,别自行添加多余头造成冲突
直接用curl测试后端响应:
curl -X OPTIONS -H "Origin: https://你的Netlify域名" https://你的Django后端域名/dj-rest-auth/user/ -v
查看响应头里是否存在Access-Control-Allow-Origin、Access-Control-Allow-Methods等字段。如果没有,问题百分百出在后端,和前端无关。
二、前端上传请求的特殊点排查
你用了Antd的Upload组件,这和普通axios请求逻辑不同,重点查:
检查Upload的请求细节
打开浏览器Network面板,查看上传请求:- OPTIONS预检请求的响应头是否包含CORS相关字段?
- PATCH请求的Request Headers里,
Authorization、Origin、Content-Type是否都正确传递? - 注意:400错误可能是后端参数验证失败,不是单纯的CORS问题——浏览器会优先显示CORS提示,别被误导。
对比普通axios请求
你handleSubmit里用axios发送的PATCH请求能否正常工作?如果这个请求能成功,问题肯定出在Upload组件的配置上:- 确认
withCredentials: true真的生效,Antd Upload偶尔会忽略该配置,可尝试手动在headers中添加Cookie头测试 - 文件上传的Content-Type是
multipart/form-data,检查后端是否开启了对PATCH请求的该类型支持(Django REST默认支持,但自定义配置可能会限制)
- 确认
三、Netlify环境的坑点排查
代理/重写配置
如果你在Netlify用了_redirects或者netlify.toml做代理,检查代理规则是否篡改了Origin头或响应头,别画蛇添足添加CORS头。HTTPS的影响
生产环境是HTTPS,本地可能是HTTP,确认后端CORS白名单里是否添加了HTTPS的Netlify域名,别只配置了本地的HTTP地址。
四、网络层面的细节排查
浏览器开发者工具扒细节
打开Chrome DevTools的Network面板,勾选Preserve log,触发上传后查看:- 先看OPTIONS请求的响应,确认预检是否通过
- 再看PATCH请求的返回内容,明确是400参数错误还是真的CORS问题
- Console面板里是否有其他隐藏错误,比如token过期导致401,也会触发CORS提示
排除浏览器扩展干扰
广告拦截、隐私类扩展会篡改CORS头,用隐身模式或禁用所有扩展后再测试。
你的代码可优化点
fileList中的url: info.profile.avatar会在info为空时报错,改成url: info?.profile?.avatar || ''更安全uploadDraggerrops里的fileList用useMemo包裹,避免组件重渲染时重复传递,防止Upload组件行为异常
内容的提问来源于stack exchange,提问作者Matthias

