📅 时间: 16:23
🌤️ 天气: 银川 6~17℃ 轻度雾霾
草色青青柳色黄,桃花历乱李花香。
— 贾至 · 《春思二首·其一》
地址添加失败 + 后端无日志 问题解决方案
在开发 PetMall 时,遇到一个问题:登录后填写收货地址,所有信息都填对了,点击保存却提示 “添加失败”,更奇怪的是,后端 Django 日志里完全没有这条地址添加的请求记录。 其他功能(商品列表、购物车、登录)都正常,只有地址添加失败,前端没明显报错,后端也没日志,排查了很久才发现,是 Django 的 CSRF 安全拦截在搞鬼 —— 前端请求没携带 CSRF 令牌,被后端中间件直接拦截,连业务逻辑都没进入。
问题核心原因
Django CSRF 安全机制拦截请求
- 后端开启
CsrfViewMiddleware+SessionAuthentication,POST 请求必须携带X-CSRFToken请求头 - 前端 Axios 未自动携带 CSRF 令牌,请求在进入业务逻辑前被直接拦截
- 因此后端无任何日志,前端提示「添加失败,请检查填写内容」
修复方案
1. 前端 Axios 全局配置 CSRF(核心修复)
修改文件:frontend/web/src/axios/index.js 添加配置:
// 适配 Django CSRF 规范
axios.defaults.xsrfCookieName = 'csrftoken';
axios.defaults.xsrfHeaderName = 'X-CSRFToken';2. 后端 Django 认证与跨域确认
确认文件:backend/server/server/settings.py
- 确保 CORS 配置允许
x-csrftoken请求头 - 确保登录状态正常,Session 认证生效
3. 消除后端分页警告(优化)
修改文件:backend/server/shopper/models.py 给地址/宠物档案模型添加默认排序,消除 UnorderedObjectListWarning:
class Address(models.Model):
# 原有字段
class Meta:
ordering = ['-id'] # 新增排序验证方式
- 重启前端
npm run dev+ 后端 Django 服务 - 登录账号后重新添加收货地址
- 后端出现
POST /api/shopper/addresses/ 201日志即为修复成功
总结
- 根本问题:Django CSRF 拦截,非前端表单/后端逻辑错误
- 修复核心:Axios 自动携带 CSRF 令牌
- 修复后:地址添加功能正常,后端日志正常,无警告无报错
Thanks for reading!
