React+Django项目部分REST接口出现CORS跨域错误求助
React与Django跨域问题:部分API触发CORS错误
我有个React客户端(运行在端口9997)和Django服务端应用(API端口9763)。本地调试时一切正常,但部署到远程服务器的Docker容器后,前端能访问部分API,却有个API一直报CORS错误——第一个API请求完全正常,第二个就出问题。
正常工作的API:rest_endpoint1
React 请求代码
import axios from "axios"; // ... async getRestEndpoint1() { let url = '/app/api/rest_endpoint1/' const axiosInstance = axios.create(); try { const response = await axiosInstance.get(url, { params: { 'format': 'json', 'propId': this.props.routeProps.match.params.propId } } ) return response.data; } catch (err) { console.error(err); } }
Django 后端代码
def getHttpJsonResponse(obj): resp = json.dumps(obj, default=str) return HttpResponse(resp, content_type="application/json", status=status.HTTP_200_OK) @api_view(http_method_names=['GET']) def getRestEndpoint1(request): entityId = request.GET['entityId'] headers = EntityObject.objects.filter(entity_id=entityId).all() resp = [] for header in headers: resp.append({ 'id': entity.id, 'subEntityName': header.subEntity_name}) return getHttpJsonResponse(resp)
触发CORS错误的API:rest_endpoint2
React 请求代码
import axios from "axios"; // ... async getRestEndpoint2() { let url = '/app/api/rest_endpoint2/' const axiosInstance = axios.create(); try { const response = await axiosInstance.get(url, { params: { 'format': 'json' } } ) return response.data; } catch (err) { console.error(err); } }
Django 后端代码
@api_view(http_method_names=['GET']) def getRestEndpoint2(request): # 业务逻辑处理 return getHttpJsonResponse(respStatsJson)
通用配置
路由配置(两个API路径规则一致)
path('api/rest_endpoint1/', getRestEndpoint1 , name='rest_endpoint1'), path('api/rest_endpoint2/', getRestEndpoint2 , name='rest_endpoint2')
Django settings.py 中的CORS配置
CORS_ORIGIN_WHITELIST = ( 'http://10.129.131.6:9997', ) if DEBUG: CORS_ALLOW_ALL_ORIGINS = True
排查要点
- DEBUG模式的坑:远程Docker部署时,
DEBUG是不是被设成False了?如果是,CORS_ALLOW_ALL_ORIGINS会失效,这时候得检查CORS_ORIGIN_WHITELIST里的地址和前端实际访问地址完全匹配吗?比如前端是不是用了域名而非IP,或者端口不对? - 异常API的响应头缺失CORS字段:对比两个API的响应头,正常的肯定有
Access-Control-Allow-Origin这类CORS头,异常的大概率没有。看看getRestEndpoint2的业务逻辑里是不是抛出了异常,导致getHttpJsonResponse没被执行,返回了Django默认的错误响应——这种响应不会自动加CORS头。 - 中间件顺序错了:确保
corsheaders.middleware.CorsMiddleware在Django中间件列表里排前面,尤其是要在CommonMiddleware之前,不然部分请求可能没被CORS中间件处理。 - Docker环境变量覆盖配置:Docker部署时是不是用环境变量改了
DEBUG或者CORS相关配置?比如容器启动时设了DEBUG=False,但CORS_ORIGIN_WHITELIST没包含前端实际的访问地址(比如前端用了反向代理后的域名)。 - 请求路径的细微差异:检查前端实际请求的URL和后端路由是不是完全匹配?比如有没有末尾斜杠的区别?如果Django的
APPEND_SLASH设为True,可能会触发重定向,重定向后的请求可能丢了CORS头。
内容的提问来源于stack exchange,提问作者MsA
相关产品推荐
相关产品推荐

