ReactJS对接Django API时GET请求出现CORS错误求助
CORS中间件顺序不正确
Django中间件按顺序执行,corsheaders.middleware.CorsMiddleware必须放在中间件列表的最前端(至少在django.middleware.common.CommonMiddleware之前)。如果顺序靠后,GET请求的响应可能在CORS头添加前就被其他中间件处理,导致缺失关键头信息。POST请求因为处理逻辑不同可能不受影响。
修复方式:修改settings.py的MIDDLEWARE配置:MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', # 其余中间件依次排列 ]GET请求触发Django错误响应
如果GET请求的路由不存在、权限验证失败或参数有误,Django返回的404/403/400错误响应可能未经过CORS中间件处理,自然不会带上Access-Control-Allow-Origin头。而POST请求可能路由正确、权限通过,所以能正常返回CORS头。
修复步骤:- 直接用Postman或浏览器访问ngrok的GET接口,确认是否返回200状态码;
- 查看Django日志,定位GET请求的具体错误原因,修复路由、权限或参数问题。
浏览器缓存了旧的无CORS头响应
之前未配置CORS时发起的GET请求可能被浏览器缓存,即使现在配置正确,浏览器仍会优先读取缓存的无CORS头响应。POST请求默认不被缓存,因此不受影响。
修复方式:- 在Chrome开发者工具的「网络」面板勾选「禁用缓存」,重新发起请求;
- 用
Ctrl+Shift+R强制刷新页面,清除相关缓存。
ALLOWED_HOSTS未包含ngrok域名
如果Django的ALLOWED_HOSTS没有添加ngrok生成的随机域名,GET请求可能被Django拦截返回400错误,此时CORS中间件根本没机会处理响应。POST请求可能因请求体格式等原因暂时绕过拦截(这种情况少见,但需排查)。
修复方式:测试阶段临时设置ALLOWED_HOSTS = ['*'],确认问题是否解决,之后再添加具体的ngrok域名。HTTPS重定向导致CORS头丢失
若本地后端用HTTP,ngrok转为HTTPS,且Django开启了SECURE_SSL_REDIRECT,GET请求会被重定向到HTTPS。重定向响应(301/302)通常不会携带CORS头,触发浏览器报错。POST请求一般不会被重定向,所以正常工作。
修复方式:临时关闭SECURE_SSL_REDIRECT = False测试,或确保重定向响应能带上CORS头。
内容的提问来源于stack exchange,提问作者ek1669

