了解 Odoo 在从启动到用户打开一个模型表单视图时,内部到底发生了什么,是模块开发、性能调优和故障排查的关键。本文将为你系统梳理 Odoo 18 的执行流程关键方法调用链,适用于开发者与技术架构师快速理解 Odoo 核心机制。


一、核心概念速查表

概念 说明
Action Odoo 前端与后端交互的动作定义,决定打开什么视图、加载哪些数据
View 视图,定义界面布局(如表单、列表、看板等)
Model 数据模型,继承自 models.Model,对应数据库表
Field 字段,模型的数据结构定义
Controller 控制器,处理 HTTP 路由请求
Service 前端服务,管理 action、数据加载、界面跳转等

二、Odoo 启动流程总览

在运行 odoo-bin 启动命令后,Odoo 会执行一系列初始化步骤,为后续操作打下基础:

1. 服务启动阶段

阶段 动作
配置加载 解析 odoo.conf 配置项(数据库连接、模块路径等)
模块扫描 扫描 addons_path 下的所有模块,加载 __manifest__.py
注册模型 加载模型、控制器、视图、安全规则等
数据库连接 初始化与 PostgreSQL 的连接,执行模块更新(若指定)
Web 服务启动 使用 werkzeug 启动 HTTP 服务,注册 /web 等路由

三、打开表单时的请求流程

假设用户点击"客户"菜单项,打开 res.partner 的表单视图,大致会经历以下流程:

2. 前端操作与服务交互流程

[用户点击菜单]
→ [前端触发 web.action.load 请求]
→ [后端加载 action & view 定义]
→ [前端渲染组件结构]
→ [前端调用 model.read 获取记录数据]
→ [渲染表单页面,等待用户交互]

关键请求路由

路由 功能
/web/action/load 加载 action 和视图结构
/web/dataset/call_kw 调用模型方法(如 read、write)加载记录数据
/web/view/view_load 异步加载视图组件(仅特殊情况)

四、后端方法调用链详解

以下是从 action 加载到表单渲染,后端执行的关键 Python 方法链:

3.1 加载 action 与视图结构

模块 方法
odoo/addons/web/controllers/main.py action_load():响应前端加载 action 请求
odoo/models.py fields_view_get():获取表单结构(arch + fields)
odoo/addons/base/models/ir_actions.py read():加载 ir.actions.act_window

3.2 加载记录数据

模块 方法
odoo/models.py read():读取记录数据
odoo/models.py check_access_rights() / check_access_rule():权限校验
odoo/fields.py convert_to_read():字段值格式转换(如 Many2one 展示 name)

五、前端组件加载机制与进阶

Odoo 18 基于 OWL(Odoo Web Library) 框架实现前端渲染,其组件化结构如下:

组件 作用
FormController 控制表单的交互逻辑,如保存、取消等
FormRenderer 渲染表单字段布局与内容
FieldWidget 渲染具体字段(如 Text、Many2one、Date 等)
ActionService 管理 action 调用及视图渲染

️ OWL 组件生命周期与自定义

  • 生命周期钩子:onWillStartonWillUpdatePropsonWillUnmount 等,便于资源管理和异步加载。
  • 自定义组件:可继承 FieldWidget 实现自定义字段渲染,注册新类型。
  • 响应式机制:OWL 支持高效的状态管理和响应式 UI 更新。
  • 调试技巧:用浏览器 DevTools 设置断点,跟踪 action_service.jsform_renderer.js 代码流。

六、用户交互与数据提交

当用户填写完表单并点击"保存"按钮时:

  • 触发 /web/dataset/call_kw,方法为 write(更新)或 create(新增)

  • 后端进入 models.py → write()create() 方法

  • 同时执行:

    • @api.onchange(界面联动)
    • @api.constrains(校验约束)
    • @api.depends(计算字段)

保存成功后,界面刷新或跳转到指定动作。


七、常见性能瓶颈与优化建议

  • 视图继承过多:合并 XML 继承,减少嵌套层级。
  • 字段过多/复杂计算字段:合理使用 @api.depends,避免循环依赖。
  • SQL 查询慢:用 logging_level=debug_sql 分析慢查询,添加索引。
  • 前端卡顿:减少一次性加载数据量,利用分页、懒加载。
  • 缓存机制:善用 Odoo 的缓存(如 @tools.ormcache)。
  • 数据库连接池:合理配置连接池参数,避免连接耗尽。
  • 模块加载优化:只加载必要模块,避免无用依赖。

八、常见问题排查案例

案例1:表单字段不显示

  • 检查 fields_view_get() 返回的 arch 是否包含该字段
  • 检查字段 readonlyinvisible 属性
  • 检查用户权限组

案例2:保存时报权限错误

  • 查看 check_access_rights()check_access_rule() 调用栈
  • 检查 ir.model.access.csv 配置
  • 用超级管理员账号复现

案例3:表单加载缓慢

  • 检查视图 XML 是否过于复杂
  • 检查是否有大量计算字段或 on_change 逻辑
  • 用浏览器 Network 面板分析接口耗时

九、开发与调试建议

常用断点位置(Python)

位置 用途
models.py → fields_view_get() 查看视图加载结构
models.py → read() 检查记录数据加载
ir_actions.py → read() 分析 action 行为
ir_ui_view.py → _get_view_arch() 检查视图 XML 定义

前端调试入口(JS)

文件 功能
action_service.js 请求 action 执行入口
form_controller.js 表单行为控制,如保存、返回等
form_renderer.js 字段渲染实现
dataset.js 封装的 RPC 调用逻辑,调用 call_kw

十、表单加载时序图(Mermaid 示例)

sequenceDiagram
participant U as 用户
participant F as 前端
participant B as Odoo 后端
U->>F: 点击菜单
F->>B: /web/action/load
B-->>F: 返回视图结构
F->>B: /web/dataset/call_kw (read)
B-->>F: 返回记录数据
F->>U: 渲染表单,等待交互
U->>F: 填写并保存
F->>B: /web/dataset/call_kw (write/create)
B-->>F: 保存结果
F-->>U: 刷新/跳转

十一、进阶阅读与资源推荐


十二、AI 与 Odoo 集成展望

随着 AI 技术发展,Odoo 可集成智能助手、自动表单填写、自然语言报表生成等能力。例如:

  • 用 ChatGPT 自动生成业务单据
  • 利用 OCR 自动录入发票
  • 通过 RPA 自动化重复操作
  • 智能推荐字段值、自动补全表单
  • 语音控制 Odoo 操作

结语

理解 Odoo 的完整执行流程是模块开发的基础,也是性能调优与 bug 排查的核心。掌握每个阶段调用的方法、参与的模块与执行顺序,能帮助你更高效地开发业务逻辑、扩展功能或处理视图问题。

如果你正在开发自定义模块、设计低代码平台或嵌入 AI 能力(如自然语言控制 Odoo 模块),也欢迎进一步交流!


如果你需要此博客的 Markdown、PDF、或直接发布到 CSDN/博客园/知乎的格式版本,我也可以帮你生成。是否需要?


十三、Odoo 18 完整执行流程:方法调用链补充


一、服务启动相关方法

步骤 模块/路径 关键方法
加载配置 odoo/tools/config.py config.parse_config()
启动服务 odoo/cli/server.py start()
加载模块 odoo/modules/registry.py Registry.load() / load_modules()
启动 Web odoo/service/server.py start_wsgi_server()
加载视图/模型 odoo/addons/base/models/ir_model.py
ir_model_fields, ir_ui_view
init(), fields_view_get()

二、用户点击菜单 → 加载 action

步骤 路由/模块 关键方法
前端发送请求 /web/action/load JS:ActionService.prototype.loadAction()
控制器处理 odoo/addons/web/controllers/main.py Home.action_load()
加载 action odoo/addons/base/models/ir_actions.py read()
加载视图 odoo/models.py fields_view_get()(解析 XML 为 arch)
视图解析器 odoo/tools/view_validation.py _validate_form_view()

三、前端接收并渲染视图结构

步骤 路由/模块 关键方法
前端接收视图结构 JS:FormRenderer, FormController setup(), onWillStart()
组件渲染 OWL 模板系统 useComponent, useSubEnv

四、加载具体记录数据

步骤 路由/模块 关键方法
请求记录数据 /web/dataset/call_kw method=read
ORM 调用 odoo/models.py read(), _read()
权限校验 odoo/models.py check_access_rights(), check_access_rule()
字段转换 odoo/fields.py convert_to_read()

五、用户交互(保存/修改记录)

步骤 路由/模块 关键方法
保存记录 /web/dataset/call_kw method=write or create
ORM 调用 odoo/models.py write(), create(), unlink()
校验与约束 @api.constrains, @api.onchange 自定义模型方法
触发计算字段 @api.depends() 被依赖字段变动后自动触发

简要追踪路径(以打开客户表单为例)

  1. 用户点击菜单:web_client.js → action_service.js → web.action.load
  2. 后端加载 action:ir.actions.act_window → ir.ui.view → fields_view_get
  3. 返回前端 JSON:包含 arch, fields, toolbar, buttons
  4. 前端组件渲染:FormRenderer, FieldWidgets, ControlPanel
  5. 请求记录数据:dataset.call_kw → model.read
  6. 前端更新字段显示内容:useState, patch, mount

常用调试断点位置(建议)

位置 用途
models.py → fields_view_get() 追踪视图定义加载
ir_actions.py → read() 查看 action 内容
models.py → read()/write() 数据加载/保存核心点
base/ir_ui_view.py → _get_view_arch() 检查自定义表单 XML
dataset.js → call_kw() 前端调试 RPC 请求

结语

理解 Odoo 的完整执行流程是模块开发的基础,也是性能调优与 bug 排查的核心。掌握每个阶段调用的方法、参与的模块与执行顺序,能帮助你更高效地开发业务逻辑、扩展功能或处理视图问题。

如果你正在开发自定义模块、设计低代码平台或嵌入 AI 能力(如自然语言控制 Odoo 模块),也欢迎进一步交流!

第2讲、从启动到表单加载:Odoo 18 的完整执行流程详解的更多相关文章

  1. 扩展JQUERY 表单加载JSON数据

    $.fn.extend({ //表单加载json对象数据 setForm : function (jsonValue) { var obj = this; $.each(jsonValue, func ...

  2. 配gzip的过滤器进行压缩解决表单加载慢问题

    一个客户的表单上字段超过五百,经浏览器的调试器发现主要问题是从服务器取数据花费了大量时间,下载内容大小约1.2M,下载时间在10s左右,导致样式加载完大约在17s左右(不清除浏览器缓存).最终考虑利用 ...

  3. 不用写代码也能做表单 —— 加载meta即可

    做增删改查要写多少代码? 一个表单一套代码,十个表单十套代码吗? 我这么懒,怎么会写这么多代码? 我想做到:即使一百个表单也只需要一套代码(而且不需要复制粘贴).实现多个表单,只需要加载不同的meta ...

  4. 单表数据加载到TreeView(.Node.Level>=2) "蝴蝶效应" SelectedNode注意事项 效能优化 综合问题

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Configurat ...

  5. 【转】linux-系统启动流程详解

    第二十章.启动流程.模块管理与 Loader 最近升级日期:2009/09/14 1. Linux 的启动流程分析 1.1 启动流程一览 1.2 BIOS, boot loader 与 kernel ...

  6. Linux启动流程详解【转载】

    在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接 ...

  7. spring websocket 和socketjs实现单聊群聊,广播的消息推送详解

    spring websocket 和socketjs实现单聊群聊,广播的消息推送详解 WebSocket简单介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随 ...

  8. 第2节 hive基本操作:11、hive当中的分桶表以及修改表删除表数据加载数据导出等

    分桶表 将数据按照指定的字段进行分成多个桶中去,说白了就是将数据按照字段进行划分,可以将数据按照字段划分到多个文件当中去 开启hive的桶表功能 set hive.enforce.bucketing= ...

  9. Spring Boot启动流程详解(一)

    环境 本文基于Spring Boot版本1.3.3, 使用了spring-boot-starter-web. 配置完成后,编写了代码如下: @SpringBootApplication public ...

  10. Scala 深入浅出实战经典 第61讲:Scala中隐式参数与隐式转换的联合使用实战详解及其在Spark中的应用源码解析

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...

随机推荐

  1. SpringSecurity5(1-快速入门)

    依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spri ...

  2. 学习高可靠Redis分布式锁实现思路

    一.分布式锁的必要性 在单体应用时代,我们使用ReentrantLock或synchronized就能解决线程安全问题.但当系统拆分为分布式架构后(目前大多数公司应该不会只是单体应用了),跨进程的共享 ...

  3. 堆排序(topk 问题)(NB)

    博客地址:https://www.cnblogs.com/zylyehuo/ # _*_coding:utf-8_*_ # 比较排序 import random def sift(li, low, h ...

  4. 【Azure Developer】分享两段Python代码处理表格(CSV格式)数据 : 根据每列的内容生成SQL语句

    问题描述 在处理一个数据收集工作任务上,收集到的数据内容格式都不能直接对应到数据库中的表格内容. 比如: 第一种情况:服务名作为第一列内容,然后之后每一列为一个人名,1:代表此人拥有这个服务,0:代表 ...

  5. 深入理解Hadoop读书笔记-1

    背景 公司的物流业务系统目前实现了使用storm集群进行过门事件的实时计算处理,但是还有一个需求,我们需要存储每个标签上传的每条明细数据,然后进行定期的标签报表统计,这个是目前的实时计算框架无法满足的 ...

  6. cURL 工具库基本使用

    cURL(Client URL)是一个功能强大的工具和库,用于与各种网络协议进行交互,cURL常用的一些参数和示例代码: -X, --request :指定HTTP请求方法(GET.POST.PUT等 ...

  7. 学习unigui【17】-数据集和JSON互相转换-DataSetConverter4D 开源项目

    学习unigui过程中,出现使用json和fdquery等数据交换的太多场景要求. 感谢开源DataSetConverter4D提供轮子. 直接抄demo: {Convert DataSet to J ...

  8. json中用到的token

    JSON Web Token (JWT)是一个开放标准(RFC 7519). 用于JSON对象在各个层之间安全地传输信息.该信息可以被验证和信任,通过数字签名. 应用场景:    Authorizat ...

  9. java基础之接口、多态

    一.接口:是Java语言中一种引用类型[组数.类也是引用类型],内部主要就是封装了方法, 包括(抽象方法.默认方法.静态方法.私有方法) 格式: public interface 接口名称 { // ...

  10. Navicat Premium 16无限试用教程

    1.前往官网下载[Navicat Premium 16] http://www.navicat.com.cn/products 2.创建清理试用信息bat Navicat Premium 16Crac ...