04-03

04-03

2026年04月03日
552 字 · 3 分钟

📅 时间: 16:23
🌤️ 天气: 银川 6~17℃ 轻度雾霾

草色青青柳色黄,桃花历乱李花香。

— 贾至 · 《春思二首·其一》

地址添加失败 + 后端无日志 问题解决方案

在开发 PetMall 时,遇到一个问题:登录后填写收货地址,所有信息都填对了,点击保存却提示 “添加失败”,更奇怪的是,后端 Django 日志里完全没有这条地址添加的请求记录。 其他功能(商品列表、购物车、登录)都正常,只有地址添加失败,前端没明显报错,后端也没日志,排查了很久才发现,是 Django 的 CSRF 安全拦截在搞鬼 —— 前端请求没携带 CSRF 令牌,被后端中间件直接拦截,连业务逻辑都没进入。

问题核心原因

Django CSRF 安全机制拦截请求

  1. 后端开启 CsrfViewMiddleware + SessionAuthentication,POST 请求必须携带 X-CSRFToken 请求头
  2. 前端 Axios 未自动携带 CSRF 令牌,请求在进入业务逻辑前被直接拦截
  3. 因此后端无任何日志,前端提示「添加失败,请检查填写内容」

修复方案

1. 前端 Axios 全局配置 CSRF(核心修复)

修改文件frontend/web/src/axios/index.js 添加配置

JAVASCRIPT
// 适配 Django CSRF 规范
axios.defaults.xsrfCookieName = 'csrftoken';
axios.defaults.xsrfHeaderName = 'X-CSRFToken';

2. 后端 Django 认证与跨域确认

确认文件backend/server/server/settings.py

  1. 确保 CORS 配置允许 x-csrftoken 请求头
  2. 确保登录状态正常,Session 认证生效

3. 消除后端分页警告(优化)

修改文件backend/server/shopper/models.py 给地址/宠物档案模型添加默认排序,消除 UnorderedObjectListWarning

PYTHON
class Address(models.Model):
    # 原有字段
    class Meta:
        ordering = ['-id']  # 新增排序

验证方式

  1. 重启前端 npm run dev + 后端 Django 服务
  2. 登录账号后重新添加收货地址
  3. 后端出现 POST /api/shopper/addresses/ 201 日志即为修复成功

总结

  • 根本问题:Django CSRF 拦截,非前端表单/后端逻辑错误
  • 修复核心:Axios 自动携带 CSRF 令牌
  • 修复后:地址添加功能正常,后端日志正常,无警告无报错

Thanks for reading!

04-03

2026年04月03日
552 字 · 3 分钟