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

部署Django+Netlify项目时上传表单遇CORS问题求助

Django REST + 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请求逻辑不同,重点查:

  1. 检查Upload的请求细节
    打开浏览器Network面板,查看上传请求:

    • OPTIONS预检请求的响应头是否包含CORS相关字段?
    • PATCH请求的Request Headers里,Authorization、Origin、Content-Type是否都正确传递?
    • 注意:400错误可能是后端参数验证失败,不是单纯的CORS问题——浏览器会优先显示CORS提示,别被误导。
  2. 对比普通axios请求
    你handleSubmit里用axios发送的PATCH请求能否正常工作?如果这个请求能成功,问题肯定出在Upload组件的配置上:

    • 确认withCredentials: true真的生效,Antd Upload偶尔会忽略该配置,可尝试手动在headers中添加Cookie头测试
    • 文件上传的Content-Type是multipart/form-data,检查后端是否开启了对PATCH请求的该类型支持(Django REST默认支持,但自定义配置可能会限制)

三、Netlify环境的坑点排查

  1. 代理/重写配置
    如果你在Netlify用了_redirects或者netlify.toml做代理,检查代理规则是否篡改了Origin头或响应头,别画蛇添足添加CORS头。

  2. HTTPS的影响
    生产环境是HTTPS,本地可能是HTTP,确认后端CORS白名单里是否添加了HTTPS的Netlify域名,别只配置了本地的HTTP地址。

四、网络层面的细节排查

  1. 浏览器开发者工具扒细节
    打开Chrome DevTools的Network面板,勾选Preserve log,触发上传后查看:

    • 先看OPTIONS请求的响应,确认预检是否通过
    • 再看PATCH请求的返回内容,明确是400参数错误还是真的CORS问题
    • Console面板里是否有其他隐藏错误,比如token过期导致401,也会触发CORS提示
  2. 排除浏览器扩展干扰
    广告拦截、隐私类扩展会篡改CORS头,用隐身模式或禁用所有扩展后再测试。

你的代码可优化点

  • fileList中的url: info.profile.avatar会在info为空时报错,改成url: info?.profile?.avatar || ''更安全
  • uploadDraggerrops里的fileList用useMemo包裹,避免组件重渲染时重复传递,防止Upload组件行为异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:42:24