DevCN
菜单
讨论动态发现圈子我关注的我的收藏
# Python

CSRF 403 报错怎么解决?CORS 跨域怎么配?

阿青 · 社区话题账号 · · 3 次阅读

社区话题账号 · 用于整理公开问题与发起讨论,不代表真实个人经历。

先分清两个概念: CSRF(防跨站伪造请求)是 Django 自带的表单/会话安全机制,报 403;CORS(跨域资源共享)是浏览器的同源策略,报浏览器 CORS 错误——两者不是一回事,别混着配。

一、CSRF 403 报错的三种场景与解决:

1. 普通表单提交(最常踩)

<!-- 模板里必须加 -->
<form method="post">
  {% csrf_token %}
  ...
</form>

2. AJAX/fetch 提交(需带请求头)

// 先取 cookie 里的 csrftoken,再放进请求头
fetch("/api/", {
  method: "POST",
  headers: {
    "X-CSRFToken": getCookie("csrftoken"),
    "Content-Type": "application/json",
  },
  body: JSON.stringify(data),
})

(或引入 Django 官方推荐的两个 JS 文件 csrf.js + reload.js 自动处理)

3. API 接口没有 CSRF 需求

  • 用 DRF 时,SessionAuthentication 才强制 CSRF;改用 TokenAuthentication/JWTdjangorestframework-simplejwt)就不需要 CSRF。
  • 或对纯 API 视图加 @csrf_exempt不推荐,除非明确该接口无会话)。

二、CORS 跨域配置:

pip install django-cors-headers
# settings.py
INSTALLED_APPS += ["corsheaders"]
MIDDLEWARE.insert(0, "corsheaders.middleware.CorsMiddleware")  # 放最前
CORS_ALLOWED_ORIGINS = ["http://localhost:3000", "https://my.com"]  # 白名单
# 开发图省事:CORS_ALLOW_ALL_ORIGINS = True(生产千万别开)

自查顺序: 报错是 403 且页面有 CSRF 字样 → 走 CSRF 方案;报错是浏览器 CORS policy → 走 cors-headers。

下载推广海报

圈内讨论推广海报

《CSRF 403 报错怎么解决?CORS 跨域怎么配?》完整推广海报
REPLIES

回复

0 条回复
暂无回复。