Django跨域POST请求返回403 Referer校验失败问题咨询
问题根因
- Django在处理HTTPS协议的POST请求时,CSRF中间件除了校验
csrfmiddlewaretoken有效性外,会强制校验请求头的Referer值,要求其属于服务端可信源,该逻辑和corsheaders的跨域配置相互独立,你配置的CORS_ORIGIN_ALLOW_ALL = True仅能解决浏览器跨域资源拦截问题,不影响CSRF的Referer校验逻辑。 - 你当前的配置中没有添加
CSRF_TRUSTED_ORIGINS参数,前端所在域名https://anotherexample.com不在Django默认的可信源列表中,因此直接被CSRF中间件拦截返回403。
修复方案
- 推荐方案:配置可信CSRF源
在settings.py中新增如下配置即可,把所有需要发起跨域POST请求的前端域名都加入列表:
CSRF_TRUSTED_ORIGINS = [ "https://anotherexample.com", # 有其他前端域名也可以按格式加在这里 ]
注意:列表内的域名必须带协议头(http/https),不能仅写域名
- 临时调试方案:给指定视图关闭CSRF校验
如果是本地开发临时测试用,可以给接收请求的视图加csrf_exempt装饰器跳过CSRF校验,生产环境不推荐使用:
from django.views.decorators.csrf import csrf_exempt from django.http import HttpResponse @csrf_exempt def your_request_view(request): # 你的业务逻辑 return HttpResponse("ok")
- 极端场景方案:全局关闭CSRF校验
如果你的服务是纯后端接口服务,没有前端页面也没有用户登录态的场景,可以直接在settings.py的MIDDLEWARE列表中删除django.middleware.csrf.CsrfViewMiddleware配置,全局关闭CSRF校验,该方案安全风险极高,非特殊场景不要使用。
内容的提问来源于stack exchange,提问作者RoyalBosS
相关产品推荐
相关产品推荐

