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

React+Redux调用Django DRF接口遇301及CORS错误求助

问题排查方案

1. 修复Django路由尾部斜杠问题

Django默认启用APPEND_SLASH配置(默认值为True),当请求URL不带尾部斜杠时,会返回301重定向到带斜杠的地址。浏览器处理跨域重定向时,容易触发CORS校验失败。

修改React中的API地址,添加尾部斜杠:

const CLASSES_API = `http://127.0.0.1:8000/learning/classes/?schoolPk=${id}`;

2. 修正ClassViewSet代码缺陷

你的ClassViewSet继承了ModelViewSet,但未定义默认queryset属性。尽管重写了get_queryset,部分DRF版本仍需要默认queryset来生成正确路由或完成权限检查。补充默认queryset并增加参数异常处理:

class ClassViewSet(viewsets.ModelViewSet):
    serializer_class = ClassSerializer
    queryset = Class.objects.all()  # 添加默认queryset

    def get_queryset(self):
        school_pk = self.request.query_params.get('schoolPk')
        if school_pk:
            return Class.objects.filter(school=school_pk)
        return Class.objects.none()  # 无参数时返回空集或全量数据,按需调整

3. 修正ALLOWED_HOSTS配置

ALLOWED_HOSTS仅需填写主机名(不带协议、端口和斜杠),当前配置中的http://localhost:3000/不符合要求,会导致Django拒绝请求。修改为:

ALLOWED_HOSTS = ['localhost', '127.0.0.1']

4. 清理冗余CORS配置

同时设置CORS_ALLOW_ALL_ORIGINS = True与CORS_ALLOWED_ORIGINS、CORS_ORIGIN_WHITELIST会导致配置冲突,保留核心配置即可:

CORS_ALLOW_ALL_ORIGINS = True
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOW_METHODS = [
    "DELETE", "GET", "OPTIONS", "PATCH", "POST", "PUT",
]
CORS_ALLOW_HEADERS = [
    "accept", "accept-encoding", "authorization", "content-type", 
    "dnt", "origin", "user-agent", "x-csrftoken", "x-requested-with",
]

5. 检查中间件顺序

确保corsheaders.middleware.CorsMiddleware排在django.middleware.common.CommonMiddleware之前,这是CORS中间件生效的关键:

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 其他中间件...
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:45:30