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

Angular向本地Django服务器发POST请求出现403错误排查

Angular向Django发送POST请求返回403的原因及解决方法

1. Token传递方式不匹配

你的Angular代码将JWT放在Authorization请求头中:

const headers = new HttpHeaders({
  'Content-Type':'application/json',
  'Authorization': 'Bearer' + token // 注意:Bearer与token之间缺少空格
});

但Django后端是从Cookie中读取token:

token = request.COOKIES.get('jwt')

Postman能正常工作,大概率是你在Postman中把JWT放到了Cookie里,而Angular是放在Header中,后端拿不到token直接返回未认证(403)。

解决方法:

  • 方案一:修改Angular逻辑,将token存入Cookie,并确保请求携带凭证;
  • 方案二:修改Django后端,从Authorization头解析token:
auth_header = request.headers.get('Authorization')
if not auth_header or not auth_header.startswith('Bearer '):
    raise AuthenticationFailed('Unauthenticated')
token = auth_header.split(' ')[1]

同时修正Angular中Authorization头的格式,在Bearer和token之间添加空格。

2. Angular请求未携带凭证(Cookie)

如果认证依赖Cookie传递token,Angular发送请求时必须显式开启withCredentials,否则浏览器会自动忽略Cookie,即使CORS配置允许凭证也无效。

解决方法:
在Angular的Http请求中添加withCredentials: true:

return this.http.get<any>(this.apiUrl_User, {
  headers,
  withCredentials: true
})

3. ALLOWED_HOSTS拼写错误

你的Django配置中ALLOWED_HOSTS里的locallhost多了一个字母l,正确写法是localhost。虽然当前CORS_ORIGIN_ALLOW_ALL = True可能暂时不影响,但该错误可能导致后续部署或其他请求异常,建议修正:

ALLOWED_HOSTS = [
    "http://localhost:4200",
    "127.0.0.1"
]

4. POST请求的CSRF令牌校验问题

针对你提到的POST请求场景:Django默认会对POST请求校验CSRF令牌,Postman因无浏览器环境或手动跳过校验能正常请求,但Angular请求未携带CSRF令牌时会返回403。

解决方法:

  • 若后端为纯API服务,可在对应视图上添加@csrf_exempt装饰器跳过校验;
  • 若需保留CSRF校验,让Angular从Cookie中读取csrftoken,并放到请求头X-CSRFToken中携带。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:55:00