第十四章 系统架构总览
篇别:第二篇 Odoo 19 系统架构
本章学习目标
- 能用 三层架构 描述 Odoo 各层职责与典型技术栈。
- 能口述一次 用户操作 从浏览器到 PostgreSQL 再返回的 请求链路。
- 理解 WebClient 的 Registry / Service / OWL 协作方式及与后端的 RPC 关系。
- 理解 Assets(bundles) 的加载、缓存与
__manifest__.py声明 role。
导读:为什么要学架构
只会写模型与视图,遇到 性能、缓存、前端不更新、跨模块 JS 顺序 问题时往往无从下手。建立 端到端架构图,能把问题定位到 数据库 / ORM / 控制器 / 静态资源 / 浏览器 中的某一环。
14.1 三层架构
14.1.1 知识要点
| 层 | 职责 | 典型技术 |
|---|---|---|
| 数据层 | 持久化、事务、索引 | PostgreSQL |
| 业务与集成层 | 模型、权限、工作流、HTTP/JSON-RPC | Python、Odoo ORM、Werkzeug/WSGI |
| 表现层 | 交互、视图渲染、静态资源 | OWL、QWeb、浏览器 |
边界:业务规则 必须在模型与权限层落实;前端校验仅为体验。
14.1.2 案例
用户点击「保存」销售订单(简化):
- 浏览器 OWL 表单收集变更 → JSON-RPC
call_kw→sale.orderwrite。 - 服务端 ORM 校验、记录规则、SQL UPDATE。
- 返回结果 → 前端更新 本地状态 / 通知。
14.1.3 截图占位

14.1.4 本节练习
- 简答:QWeb 报表 PDF 主要落在哪两层?
- 简答:网站访客 访问公开页面时,表现层是否仍主要是 OWL?
- 判断:所有业务逻辑都应放在表现层以减轻服务器压力。( )
参考答案提示:1. 业务层渲染 + 数据层读。2. 可能混合 QWeb/OWL/静态,依页面而定。3. 错。
14.2 请求处理流程
14.2.1 知识要点
- HTTP 请求 进入 WSGI 应用。
- 路由 匹配 Controller(
type='http'或type='jsonrpc'等,以 19.0 为准)。 request.env构造 Environment(cr, uid, context)。- 调用 模型方法 或 返回模板/JSON。
- 事务提交/回滚(Web 请求结束时;子事务/保存点另论)。
14.2.2 案例
调试技巧:
- 在自定义
http.Controller中import logging; _logger = logging.getLogger(__name__)打日志。 - 对
call_kw用浏览器 Network 查看 model、method、args。
14.2.3 截图占位


14.2.4 本节练习
- 实操:记录一次
type='http'与type='jsonrpc'在 Content-Type、请求体格式 上的差异。 - 简答:
jsonrpc路由与 公开 REST 自写 Controller 的边界? - 拓展:阅读官方「Controllers」文档中关于 CSRF 的一节,一句话总结。
14.3 WebClient 架构(新增)
14.3.1 知识要点
- 单页应用(SPA):主入口加载
web.assets_backend等 bundle。 - Registry:
fields、services、actions、views等 分类注册表,模块启动时 add。 - Service:长生命周期对象,
useService注入组件。 - OWL:视图控制器、字段组件、对话框等均组件化。
14.3.2 案例
浏览器控制台(开发者模式下部分版本暴露 odoo.__DEBUG__,以实际为准):
// 示例:探索性质,版本不同可能路径不同
推荐阅读:第三十二章 附录 WebClient 结构。
14.3.3 截图占位

14.3.4 本节练习
- 简答:Service 与「模块导出的单例对象」在 测试替换 上的差异?
- 实操:在开发者模式下打开 调试菜单 → 查看资产(若版本提供),记录当前 backend bundle 名。
14.4 资产管理(Assets)(新增)
14.4.1 知识要点
__manifest__.py→assets:声明各 bundle 包含的 js/scss/xml。- 操作:
before/replace/remove/include控制顺序与替换(见第三十二章 32.7)。 - 缓存:生产环境文件名常带 hash;升级后需 刷新 CDN/浏览器缓存。
ir.asset:部分场景下数据库记录资产(若启用),与文件 manifest 并存。
14.4.2 案例
故意错误路径
'assets': {
'web.assets_backend': [
'my_module/static/src/js/nonexistent.js',
],
},
升级或加载时应出现 404 或构建错误(依阶段而定)。
14.4.3 截图占位

14.4.4 本节练习
- 实操:新增一行 SCSS 修改导航背景色,
-u后硬刷新验证。 - 简答:assets 指纹 与 长期缓存 的关系?
- 判断:改 Python 模型后必须清 assets 缓存。( )
参考答案提示:3. 错;改 JS/CSS/模板才相关。
14.5 与部署相关的架构要点(简)
14.5.1 知识要点
- 多 worker:进程间 不共享内存;会话、ORM 缓存以 数据库/中间件 为准。
- 反向代理:
X-Forwarded-*+proxy_mode;WebSocket(Discuss 等)需代理支持。 - 长请求:报表、导入 → 调大 timeout 或异步作业。
14.5.2 本节练习
- 简答:为何 多 worker 下 内存级全局变量 不可靠?
- 拓展:阅读第四十二章中 Nginx 小节,记录一条与 超时 相关的配置名。
本章综合练习
- 绘图:序列图——从点击菜单到列表首屏数据展示(Browser → RPC → ORM → SQL → 返回)。
- 性能:说明 assets 指纹 如何减少 重复下载 与 错误缓存。
- 故障:用户报告「改 JS 不生效」——列出 5 步排查(模块升级、浏览器、CDN、debug 资产、路径)。
- 对比:Odoo WebClient 与传统 服务端渲染 Jinja 应用在 SEO、首屏、交互 上的差异(简答)。
本章对应白皮书目录:第十四章 系统架构总览。