Django API跨域问题及安装django-cors-headers后报错求助
问题原因与解决方案
一、Python能访问但JavaScript不行的原因
- Python的
requests库属于后端HTTP请求工具,不受浏览器同源策略限制,直接向服务器发送请求并接收响应,不需要额外的CORS头验证。 - 浏览器会强制执行同源策略:当JavaScript从不同域名/端口/协议请求API时,浏览器会自动发送OPTIONS预检请求,检查服务器返回的
Access-Control-Allow-Origin等CORS响应头。如果服务器未返回这些头,浏览器会阻止JavaScript获取响应(哪怕服务器返回了200状态码),这就是你看到的跨域错误。
二、安装django-cors-headers后报错的原因
你的Django Rest Framework(DRF)版本3.12.4发布于2021年,完全不兼容Django 5.1.2:
Django 5.x版本移除了django.http.multipartparser.parse_header方法,但旧版DRF的renderers.py文件仍在尝试导入该方法,直接导致了导入错误和模板库加载失败。
三、解决步骤
1. 升级DRF到兼容Django 5.1.2的版本
运行以下命令升级DRF(3.16.x是支持Django 5.1的最低DRF版本):
pip install --upgrade djangorestframework>=3.16.0
2. 正确配置django-cors-headers
先确保安装兼容的django-cors-headers版本:
pip install --upgrade django-cors-headers
然后修改项目的settings.py:
- 将
corsheaders加入INSTALLED_APPS:
INSTALLED_APPS = [ # ... 其他已存在的应用 'corsheaders', ]
- 将CORS中间件加入
MIDDLEWARE(注意要放在CommonMiddleware之前):
MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', # ... 其他已存在的中间件 ]
- 配置允许跨域的源(根据环境选择):
# 开发环境可临时允许所有源(生产环境不建议) CORS_ALLOW_ALL_ORIGINS = True # 生产环境建议指定具体允许的域名 # CORS_ALLOWED_ORIGINS = [ # "https://your-svelte-domain.com", # "http://localhost:5173", # 本地Svelte开发端口 # ]
3. 重启Django服务
完成配置后,重启Django开发服务器,再用Svelte的fetch请求测试即可正常获取数据。
内容的提问来源于stack exchange,提问作者vianneyba
相关产品推荐
相关产品推荐

