第2讲、从启动到表单加载:Odoo 18 的完整执行流程详解
了解 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 组件生命周期与自定义
- 生命周期钩子:
onWillStart、onWillUpdateProps、onWillUnmount等,便于资源管理和异步加载。 - 自定义组件:可继承
FieldWidget实现自定义字段渲染,注册新类型。 - 响应式机制:OWL 支持高效的状态管理和响应式 UI 更新。
- 调试技巧:用浏览器 DevTools 设置断点,跟踪
action_service.js、form_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 是否包含该字段 - 检查字段
readonly、invisible属性 - 检查用户权限组
案例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 示例)
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.pyir_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() |
被依赖字段变动后自动触发 |
简要追踪路径(以打开客户表单为例)
- 用户点击菜单:
web_client.js → action_service.js → web.action.load - 后端加载 action:
ir.actions.act_window → ir.ui.view → fields_view_get - 返回前端 JSON:包含
arch,fields,toolbar,buttons - 前端组件渲染:
FormRenderer,FieldWidgets,ControlPanel - 请求记录数据:
dataset.call_kw → model.read - 前端更新字段显示内容:
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 的完整执行流程详解的更多相关文章
- 扩展JQUERY 表单加载JSON数据
$.fn.extend({ //表单加载json对象数据 setForm : function (jsonValue) { var obj = this; $.each(jsonValue, func ...
- 配gzip的过滤器进行压缩解决表单加载慢问题
一个客户的表单上字段超过五百,经浏览器的调试器发现主要问题是从服务器取数据花费了大量时间,下载内容大小约1.2M,下载时间在10s左右,导致样式加载完大约在17s左右(不清除浏览器缓存).最终考虑利用 ...
- 不用写代码也能做表单 —— 加载meta即可
做增删改查要写多少代码? 一个表单一套代码,十个表单十套代码吗? 我这么懒,怎么会写这么多代码? 我想做到:即使一百个表单也只需要一套代码(而且不需要复制粘贴).实现多个表单,只需要加载不同的meta ...
- 单表数据加载到TreeView(.Node.Level>=2) "蝴蝶效应" SelectedNode注意事项 效能优化 综合问题
using System; using System.Collections.Generic; using System.ComponentModel; using System.Configurat ...
- 【转】linux-系统启动流程详解
第二十章.启动流程.模块管理与 Loader 最近升级日期:2009/09/14 1. Linux 的启动流程分析 1.1 启动流程一览 1.2 BIOS, boot loader 与 kernel ...
- Linux启动流程详解【转载】
在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接 ...
- spring websocket 和socketjs实现单聊群聊,广播的消息推送详解
spring websocket 和socketjs实现单聊群聊,广播的消息推送详解 WebSocket简单介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随 ...
- 第2节 hive基本操作:11、hive当中的分桶表以及修改表删除表数据加载数据导出等
分桶表 将数据按照指定的字段进行分成多个桶中去,说白了就是将数据按照字段进行划分,可以将数据按照字段划分到多个文件当中去 开启hive的桶表功能 set hive.enforce.bucketing= ...
- Spring Boot启动流程详解(一)
环境 本文基于Spring Boot版本1.3.3, 使用了spring-boot-starter-web. 配置完成后,编写了代码如下: @SpringBootApplication public ...
- Scala 深入浅出实战经典 第61讲:Scala中隐式参数与隐式转换的联合使用实战详解及其在Spark中的应用源码解析
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...
随机推荐
- Opencv | 图形学 | Mingw64 | 如何正确地用MinGW64编译与配置vscode的Opencv环境
如何正确地用MinGW64编译与配置vscode的Opencv环境 1.前情提要 最近有关于图形学的授课,教授开始布置的上机打码的代码实现作业了.虽说教授为了让我们省心,直接就整了个环境已经配置好的几 ...
- Coordinate Spaces
Coordinate Spaces 本主题包含以下部分: 根空间 用户空间 像素空间 任何VisionPro图像支持一系列坐标空间,以提供一个数值框架来表达特定特征的位置.最有用的空间是根空间,它将点 ...
- [解决方案]git pull : error: cannot lock ref 'refs/remotes/origin/*' (unable to update local ref)
错误 git pull 报错不能更新本地分支 错误分析 本地分支跟远程分支不匹配 导致更新失败 解决方案 备份自己修改的代码 .git\refs\remotes (文件路径)对应删除你报错的分支 gi ...
- 花3分钟来了解一下Vue3中的插槽到底是什么玩意
前言 插槽看着是一个比较神秘的东西,特别是作用域插槽还能让我们在父组件里面直接访问子组件里面的数据,这让插槽变得更加神秘了.其实Vue3的插槽远比你想象的简单,这篇文章我们来揭开插槽的神秘面纱. 欧阳 ...
- layui 点击链接复制内容到剪切板
var tableObj = table.render({ id: 'list_table', elem: '#list_table', url: '', align: "center&qu ...
- 基于 .NET Blazor 开源、低代码、易扩展的插件开发框架
前言 今天大姚给大家分享一个基于 .NET Blazor 开源的轻量级.跨平台.低代码.易扩展的插件开发框架:Known. 项目介绍 Known 是一个基于 Blazor 的轻量级.跨平台.低代码.易 ...
- ant-design-pro 自定义表单 rules规则
表单输入 <ProFormText name="id" label={intl.formatMessage({ id: 'pages.secret.form.id' })} ...
- selenium自动化测试+OCR-获取图片页面小说
随着爬虫技术的发展,反爬虫技术也越来越高. 目前有些网站通过自定义字体库的方式实现反爬,主要表现在页面数据显示正常,但是页面获取到的实际数据是别的字符或者是一个编码.这种反爬需要解析网站自己的字体库, ...
- 关于IPMP
国际项目经理资质认证(International Project Manager Professional,简称IPMP)是国际项目管理协会(International Project Managem ...
- 使用Docker部署服务
一.Docker概念 1.操作系统层面的虚拟化技术 2.隔离的进程独立于宿主和其它的隔离的进程 - 容器 3.GO语言开发 4.特点:高效的利用系统资源:快速的启动时间:一致的运行环境:持续交付和部署 ...