促销页上线后英文站整页 500,日志里是 KeyError: 'order.paid',同一份代码中文站正常,出错请求占当天 37%。乍看像缓存或者权限的锅,追下去往往不是。
python manage.py i18n_missing --locale en grep -c "order.paid" locale/zh_CN/LC_MESSAGES/messages.po
追下去是这么回事:消息表按 locale 取子字典后直接用方括号索引 key,缺词时抛异常而不是回退到默认语言。英文词条是后补的,只覆盖了 82% 的 key,促销页用的三个新词条都没进表。异常没有被模板层捕获,整页渲染中断。
「消息表缺 key」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
具体做法是,把取值改成 get 并配置默认语言回退 缺词先返回中文;上线前跑脚本对比各语言 key 集合 输出缺失清单;模板渲染外层捕获缺词异常 记录 key 和 locale 后继续渲染;补完词条重跑缺失检查 确认差集为空。
验收就看一点,英文站促销页返回 200,日志里不再出现 KeyError,缺失清单为 0 条。
