第十四章 系统架构总览

篇别:第二篇 Odoo 19 系统架构

本章学习目标

  • 能用 三层架构 描述 Odoo 各层职责与典型技术栈。
  • 能口述一次 用户操作 从浏览器到 PostgreSQL 再返回的 请求链路
  • 理解 WebClientRegistry / 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 案例

用户点击「保存」销售订单(简化):

  1. 浏览器 OWL 表单收集变更 → JSON-RPC call_kwsale.order write
  2. 服务端 ORM 校验、记录规则、SQL UPDATE
  3. 返回结果 → 前端更新 本地状态 / 通知

14.1.3 截图占位

图 14-1 三层架构自绘框图

14.1.4 本节练习

  1. 简答QWeb 报表 PDF 主要落在哪两层?
  2. 简答网站访客 访问公开页面时,表现层是否仍主要是 OWL?
  3. 判断:所有业务逻辑都应放在表现层以减轻服务器压力。( )

参考答案提示:1. 业务层渲染 + 数据层读。2. 可能混合 QWeb/OWL/静态,依页面而定。3. 错。


14.2 请求处理流程

14.2.1 知识要点

  1. HTTP 请求 进入 WSGI 应用。
  2. 路由 匹配 Controllertype='http'type='jsonrpc' 等,以 19.0 为准)。
  3. request.env 构造 Environmentcr, uid, context)。
  4. 调用 模型方法返回模板/JSON
  5. 事务提交/回滚(Web 请求结束时;子事务/保存点另论)。

14.2.2 案例

调试技巧

  • 在自定义 http.Controllerimport logging; _logger = logging.getLogger(__name__) 打日志。
  • call_kw 用浏览器 Network 查看 model、method、args

14.2.3 截图占位

图 14-2 Network:call_kw 请求体 model/method

图 14-2b 同一请求的 Response 结构

14.2.4 本节练习

  1. 实操:记录一次 type='http'type='jsonrpc'Content-Type、请求体格式 上的差异。
  2. 简答jsonrpc 路由与 公开 REST 自写 Controller 的边界?
  3. 拓展:阅读官方「Controllers」文档中关于 CSRF 的一节,一句话总结。

14.3 WebClient 架构(新增)

14.3.1 知识要点

  • 单页应用(SPA):主入口加载 web.assets_backend 等 bundle。
  • Registryfieldsservicesactionsviews分类注册表,模块启动时 add
  • Service:长生命周期对象,useService 注入组件。
  • OWL:视图控制器、字段组件、对话框等均组件化。

14.3.2 案例

浏览器控制台(开发者模式下部分版本暴露 odoo.__DEBUG__,以实际为准):

// 示例:探索性质,版本不同可能路径不同

推荐阅读:第三十二章 附录 WebClient 结构

14.3.3 截图占位

图 14-3 Sources 中 @web 包结构

14.3.4 本节练习

  1. 简答Service 与「模块导出的单例对象」在 测试替换 上的差异?
  2. 实操:在开发者模式下打开 调试菜单 → 查看资产(若版本提供),记录当前 backend bundle 名。

14.4 资产管理(Assets)(新增)

14.4.1 知识要点

  • __manifest__.pyassets:声明各 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 Network:web.assets_backend 子资源列表

14.4.4 本节练习

  1. 实操:新增一行 SCSS 修改导航背景色,-u 后硬刷新验证。
  2. 简答assets 指纹长期缓存 的关系?
  3. 判断:改 Python 模型后必须清 assets 缓存。( )

参考答案提示:3. 错;改 JS/CSS/模板才相关。


14.5 与部署相关的架构要点(简)

14.5.1 知识要点

  • 多 worker:进程间 不共享内存;会话、ORM 缓存以 数据库/中间件 为准。
  • 反向代理X-Forwarded-* + proxy_modeWebSocket(Discuss 等)需代理支持。
  • 长请求:报表、导入 → 调大 timeout 或异步作业。

14.5.2 本节练习

  1. 简答:为何 多 worker内存级全局变量 不可靠?
  2. 拓展:阅读第四十二章中 Nginx 小节,记录一条与 超时 相关的配置名。

本章综合练习

  1. 绘图序列图——从点击菜单到列表首屏数据展示(Browser → RPC → ORM → SQL → 返回)。
  2. 性能:说明 assets 指纹 如何减少 重复下载错误缓存
  3. 故障:用户报告「改 JS 不生效」——列出 5 步排查(模块升级、浏览器、CDN、debug 资产、路径)。
  4. 对比:Odoo WebClient 与传统 服务端渲染 Jinja 应用在 SEO、首屏、交互 上的差异(简答)。

本章对应白皮书目录:第十四章 系统架构总览。