Django服务通过主机IP访问API时出现CORS跨域请求失败问题
问题根因
你碰到的状态码为null的CORS拦截报错,本质是请求根本没拿到Django返回的合法跨域响应头,不是单一配置错误,是几个高频踩坑点叠加导致的:
- 最核心的问题:Django默认启动的runserver服务只绑定127.0.0.1回环地址,不监听局域网网卡的请求,其他局域网设备发的请求根本到不了Django应用层,自然不会返回跨域相关响应头,浏览器直接判定请求失败。
- CORS配置格式错误:
CORS_ORIGIN_WHITELIST要求填写带协议、带端口的完整源地址,你之前填的纯IP、通配符*都不符合配置规范,在新版django-cors-headers中白名单不支持直接写通配符。 - 部分配置逻辑混淆:空列表的
ALLOWED_HOSTS在非DEBUG模式下会直接拒绝所有请求,配置错误时会直接断开连接,也不会返回跨域头。
你贴的MIDDLEWARE配置顺序是正确的,CorsMiddleware放在CommonMiddleware之前符合官方要求,这部分没有问题。
解决步骤
按顺序操作即可修复:
- 启动Django服务时绑定所有网卡地址,替换默认启动命令为:
启动后先在局域网其他设备的浏览器直接访问python manage.py runserver 0.0.0.0:8000http://192.168.15.66:8000/api/service/,能看到接口返回内容就说明网络层已经打通。 - 修正django-cors-headers配置,打开
settings.py调整配置:- 开发环境快速调试的话,直接开启全局跨域允许,不要在白名单中写
*,新增配置:CORS_ALLOW_ALL_ORIGINS = True - 如果需要精确控制允许的源,关闭全局允许后,在白名单中填写前端服务的完整访问地址,比如React默认跑在3000端口的配置:
注意:白名单地址必须带CORS_ALLOW_ALL_ORIGINS = False CORS_ORIGIN_WHITELIST = [ "http://localhost:3000", "http://192.168.15.66:3000" ]http://或https://协议头,非80/443端口必须写明端口号,末尾不要加斜杠。
- 开发环境快速调试的话,直接开启全局跨域允许,不要在白名单中写
- 调整ALLOWED_HOSTS配置,开发环境直接设置为允许所有主机:
生产部署时再替换为实际的服务IP或域名即可。ALLOWED_HOSTS = ["*"] - 确认依赖包安装完整,执行以下命令避免漏装django-cors-headers:
pip install django-cors-headers
排查校验
改完配置重启Django服务后再发请求,如果还是报错,打开浏览器开发者工具的网络面板,查看对应API请求的响应:
- 如果完全没有响应内容,检查本机防火墙是否放开了8000端口,确认启动命令确实绑定了0.0.0.0
- 如果有响应内容但响应头中没有
Access-Control-Allow-Origin字段,检查settings.py的配置是否正确保存、有没有被其他配置覆盖
内容的提问来源于stack exchange,提问作者user1589169
相关产品推荐
相关产品推荐

