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开头的地址
2. 配置跨子域共享的CSRF Cookie
修改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
相关产品推荐
相关产品推荐

