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

Django多子域项目提交表单遇CSRF 403错误的解决求助

解决Django跨子域CSRF验证失败(403 Forbidden)问题

核心原因

跨子域提交表单时,Django的CSRF机制默认会验证请求Origin是否在可信列表,同时CSRF Cookie的域配置错误会导致前端无法携带正确令牌,进而出现Origin为null或不匹配的验证失败。

具体修复步骤

1. 配置可信CSRF来源

在settings.py中更新CSRF_TRUSTED_ORIGINS,添加所有涉及的子域:

# settings.py
import os
from dotenv import load_dotenv

load_dotenv()

CSRF_TRUSTED_ORIGINS = [
    "http://localhost:8000",
    "http://jobseeker.localhost:8000",
    "http://recruiter.localhost:8000"
]
# 生产环境使用HTTPS时,替换为https开头的地址

修改settings.py中的Cookie配置,让CSRF Cookie可被所有localhost子域访问:

# settings.py
SESSION_COOKIE_DOMAIN = ".localhost"  # 前缀点表示匹配所有localhost子域
CSRF_COOKIE_DOMAIN = ".localhost"
CSRF_COOKIE_SECURE = False  # 开发环境设为False,HTTPS生产环境改为True
SESSION_COOKIE_SECURE = False

3. 确保表单正确携带CSRF令牌

在Home应用的注册表单模板中,正确渲染CSRF令牌并指定正确的提交地址:

<!-- Home应用的注册表单模板 -->
<form method="post" action="http://jobseeker.localhost:8000/你的注册接口路径/">
    {% csrf_token %}
    <!-- 表单字段示例 -->
    <input type="text" name="username" placeholder="用户名">
    <!-- 其他字段... -->
    <button type="submit">注册</button>
</form>

4. 同步.env配置

确保.env文件未覆盖上述关键配置,示例:

DEBUG=True
ALLOWED_HOSTS=localhost,jobseeker.localhost,recruiter.localhost
SESSION_COOKIE_DOMAIN=.localhost
CSRF_COOKIE_DOMAIN=.localhost

5. 验证hosts文件映射

确认本地hosts文件已正确配置子域映射:

# Windows路径:C:\Windows\System32\drivers\etc\hosts
# Linux/macOS路径:/etc/hosts
127.0.0.1 localhost
127.0.0.1 jobseeker.localhost
127.0.0.1 recruiter.localhost

额外注意事项

  • 开发环境不要开启CSRF_COOKIE_HTTPONLY(默认False),否则前端AJAX请求无法获取CSRF令牌
  • 若使用AJAX提交,需在请求头中携带X-CSRFToken,值从Cookie中读取
  • 修改配置后必须重启Django开发服务器才能生效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:40:39