04-03

04-03 的生活记录

📅 时间: 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 令牌
  • 修复后:地址添加功能正常,[[后端]]日志正常,无警告无报错

授权

04-03

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

© xiexienila · CC BY-NC-SA 4.0