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

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

排查要点

  1. DEBUG模式的坑:远程Docker部署时,DEBUG是不是被设成False了?如果是,CORS_ALLOW_ALL_ORIGINS会失效,这时候得检查CORS_ORIGIN_WHITELIST里的地址和前端实际访问地址完全匹配吗?比如前端是不是用了域名而非IP,或者端口不对?
  2. 异常API的响应头缺失CORS字段:对比两个API的响应头,正常的肯定有Access-Control-Allow-Origin这类CORS头,异常的大概率没有。看看getRestEndpoint2的业务逻辑里是不是抛出了异常,导致getHttpJsonResponse没被执行,返回了Django默认的错误响应——这种响应不会自动加CORS头。
  3. 中间件顺序错了:确保corsheaders.middleware.CorsMiddleware在Django中间件列表里排前面,尤其是要在CommonMiddleware之前,不然部分请求可能没被CORS中间件处理。
  4. Docker环境变量覆盖配置:Docker部署时是不是用环境变量改了DEBUG或者CORS相关配置?比如容器启动时设了DEBUG=False,但CORS_ORIGIN_WHITELIST没包含前端实际的访问地址(比如前端用了反向代理后的域名)。
  5. 请求路径的细微差异:检查前端实际请求的URL和后端路由是不是完全匹配?比如有没有末尾斜杠的区别?如果Django的APPEND_SLASH设为True,可能会触发重定向,重定向后的请求可能丢了CORS头。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 07:33:12