调试 Odoo 19 会涉及 Python 模型、OWL、JSON-RPC 与记录规则。HTTP / OWL / 前端打包也有变化,部分旧习惯会失效。优先用可落地的检查手段。
1. 看 JSON-RPC 正文,别只看 HTTP 状态码
多数业务错误仍返回 HTTP 200,真正异常在 JSON-RPC 的 error 里:
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": 200,
"message": "Odoo Server Error",
"data": {
"name": "odoo.exceptions.ValidationError",
"debug": "Traceback ...",
"message": "The field 'email' is required."
}
}
}
HTTP 重构后已无 exception_type——请用 data.name。
客户端取值:response.error?.data?.name。
2. 服务端调试日志
配置文件 odoo.conf:
[options] log_level = debug log_handler = :DEBUG
启动命令:
python odoo-bin --log-level=debug --log-handler=:DEBUG -c odoo.conf
按模块定点输出日志,减少噪音:
--log-handler=odoo.addons.your_module:DEBUG
参考文件:odoo.conf.debug.sample
3. 方法内断点(仅开发环境使用)
def action_confirm(self):
breakpoint() # 或: import pdb; pdb.set_trace()
return super().action_confirm()
⚠️ 切勿留在生产环境——进程会挂起且不一定有明确报错。
4. 拦截前端 RPC
按钮 / OWL 触发的流程常走 /web/dataset/call_kw。
操作:浏览器 DevTools → Network,过滤 XHR,查看请求/响应 JSON。
临时 RPC 包装脚本(上线提交前务必删除):static/src/rpc_debug_snippet.js。
5. 抛出正确的异常类
from odoo.exceptions import UserError, ValidationError, AccessError, MissingError
raise UserError("You can't confirm an order without a customer.")
raise ValidationError("The delivery date cannot be in the past.")
raise AccessError("You don't have rights to approve this record.")
raise MissingError("Record missing.")
建议:少用裸 ValueError / Exception——前端映射与调试信息较差。
示例代码:models/sale_order.py
6. 自动化可能“静默无果”
服务器动作 / 定时任务 / 字段自动化有独立事务。
- 域名不匹配 → 0 行数据处理 → 不报错
- 抛出真实异常 → 事务回滚、前端弹窗提示
无 SSH 时,直接查询 ir_logging 日志表:
SELECT name, level, message, create_date
FROM ir_logging
WHERE level IN ('ERROR', 'WARNING')
ORDER BY create_date DESC
LIMIT 50;