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

使用Django作为Ionic应用后端时遭遇CORS错误求助

解决Ionic调用Django DRF API的CORS错误

看起来你遇到的核心问题是自定义请求头未被CORS策略允许,导致预检请求失败,进而引发后续的请求错误。咱们一步步来解决:

问题根源分析

你在Ionic的请求里添加了自定义的username和password请求头,但默认情况下django-cors-headers并不会自动允许这些非标准的HTTP头。浏览器发起跨域请求前会先发送OPTIONS预检请求,检查后端是否允许这些自定义头,当发现password不在允许列表里时,就会拦截请求,抛出你看到的第一个错误;第二个错误则是预检失败后的连锁结果。

解决方案:配置Django允许自定义请求头

在你的Django项目的settings.py里,添加以下配置来允许自定义头:

# 直接定义允许的所有请求头,包含你自定义的字段
CORS_ALLOW_HEADERS = [
    "accept",
    "accept-encoding",
    "authorization",
    "content-type",
    "dnt",
    "origin",
    "user-agent",
    "x-csrftoken",
    "x-requested-with",
    # 追加你用到的两个自定义头
    "username",
    "password",
]

或者更简洁的方式,在默认允许的头集合基础上追加:

from corsheaders.defaults import default_headers

CORS_ALLOW_HEADERS = default_headers + (
    'username',
    'password',
)

修改完成后,记得重启你的Apache服务器,让新的配置生效。

额外的优化建议

还有个小提醒:你现在把username和password放在每个GET请求的头里,其实更安全规范的做法是只在获取JWT Token的POST请求(/api-token)中传递这些凭证,后续的API请求只需要携带Authorization: Bearer <token>就足够验证身份了。这样既减少了敏感信息的暴露次数,也能避免不必要的自定义头带来的CORS问题。

调整后的fetchMovies代码可以改成这样:

fetchMovies() {
  const httpOptions = {
    headers: new HttpHeaders({
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${this.authService.getToken()}`,
    })
  }
  return this.http.get(this.url, httpOptions).pipe(tap(resData => {
    console.log(resData);
  }));
}

如果业务上确实需要每次请求都携带这两个头,保持前面的CORS配置即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 08:12:36