第6讲、 Odoo 18 `tools` 模块深度分析

article/2025/9/9 0:51:38

Odoo 18 中的 odoo/tools 目录是核心工具模块的集合,封装了大量通用功能,包括数据处理、安全校验、缓存优化、文件处理、时间转换、国际化、多线程处理等。这些工具模块在整个 Odoo 框架中被频繁引用,是系统高效运行和代码解耦的重要基础。


🧭 目录结构总览

odoo/tools 目录下包含了众多核心文件,以下是常见模块及其主要功能:

odoo/tools/
├── __init__.py
├── cache.py             # 缓存机制
├── config.py            # 配置解析器(封装 argparse)
├── convert.py           # XML/CSV 转换(用于加载数据)
├── date_utils.py        # 日期操作辅助
├── float_utils.py       # 浮点数精度处理
├── image.py             # 图像处理工具
├── misc.py              # 杂项工具函数
├── profiler.py          # 性能分析
├── safe_eval.py         # 安全的表达式计算
├── translate.py         # 翻译与 i18n 支持
├── unique.py            # 唯一 ID 生成器
├── view_validation.py   # XML 视图结构校验
├── yaml_import.py       # YAML 数据导入支持
├── threading.py         # 多线程扩展支持
└── ... (其他工具模块)

此外,tools 目录还包含大量辅助模块,涵盖路径定位、条码、邮件、国际化、SQL、性能分析、版本兼容等各类场景。例如:

  • appdirs.py:跨平台应用目录定位
  • barcode.py:条码校验与生成
  • cloc.py:代码行数统计
  • func.py:函数式工具
  • i18n.py:国际化辅助
  • json.py:JSON 序列化/反序列化
  • mail.py:邮件相关工具
  • osutil.py:操作系统相关工具
  • profiler.py:性能分析
  • set_expression.py:集合表达式解析
  • sql.py:SQL 辅助
  • template_inheritance.py:QWeb 模板继承
  • xml_utils.py:XML 处理工具
  • …(详见源码)

🔍 核心模块源码解读

1. cache.py:高效缓存机制

  • 功能:实现内存级缓存,广泛用于 ORM 与 API 层,提升性能(如 @ormcache, @lru 等)。

  • 核心类与装饰器

    • Cache:缓存对象基础类
    • LRU:最近最少使用缓存
    • 装饰器:@ormcache, @lru, @lazy_property
  • 示例

    from odoo.tools.cache import ormcacheclass Product(models.Model):_name = "product.product"@ormcache('self.env.uid', 'self.env.cr.dbname')def compute_heavy_data(self):# 缓存计算结果,避免重复开销...
    
  • 进阶:支持 context 参与缓存 key(@ormcache_context),可统计命中率,支持全局清理。


2. safe_eval.py:安全表达式求值

  • 功能:封装 eval(),只允许白名单表达式,广泛用于配置、域表达式、动态代码等。

  • 安全设计

    • 屏蔽所有内置函数,仅开放部分安全函数
    • 支持自定义上下文环境
    • 严格校验 Python 字节码,禁止导入、属性访问、全局变量等
  • 示例

    from odoo.tools.safe_eval import safe_evalsafe_eval("1 + 2")               # ✅ 合法
    safe_eval("__import__('os')")    # ❌ 拦截
    

3. convert.py:数据文件加载器

  • 功能:解析 XML、CSV、YAML 文件并转换为数据库记录。模块安装时的数据导入均通过此模块处理。
  • 主要类与函数
    • convert_xml_import()
    • convert_csv_import()
  • 机制
    • 解析 Odoo 的 XML 模型结构
    • 支持 External ID 跨模块引用
    • 支持 noupdate, eval, ref 等语法

4. float_utils.py:浮点数精度处理

  • 功能:专门处理金额、精度、舍入误差等问题,避免 IEEE-754 浮点误差。

  • 常用函数

    • float_compare
    • float_round
    • float_is_zero
  • 示例

    from odoo.tools.float_utils import float_comparefloat_compare(0.1 + 0.2, 0.3, precision_digits=2)  # ✅ 避免误差问题
    

5. config.py:配置参数解析

  • 功能:封装对 odoo.conf 配置文件和命令行参数的读取,主要用于服务启动时的配置加载。

  • 示例

    from odoo.tools.config import configdb_host = config['db_host']
    addons_path = config['addons_path']
    

6. translate.py:翻译系统

  • 功能:负责 .po 文件的加载、翻译字典生成、多语言处理等,支持导入导出翻译、多语言视图/字段、_() 方法文本翻译。

7. view_validation.py:视图 XML 校验

  • 功能:检查模块视图定义中的 XML 是否符合语法要求,如标签嵌套、字段合法性、继承关系等。

8. misc.py:杂项工具集合

  • 功能:包含大量通用函数,如 file_open(安全文件访问)、apply_instructions(字段计算表达式)、uniq_list(去重列表)、split_every(分块处理)等。
  • 适用场景:文件、字符串、集合、国际化、加密、排序、分组、异常处理等底层通用需求。

9. threading.py:Odoo 特化的线程工具

  • 功能:封装标准 threading,支持线程本地数据、线程安全的 env 调度等。

10. image.py:图像处理工具

  • 功能:对 PIL(Pillow)进行封装,支持图片缩放、格式转换、中心裁剪、二进制图片处理等。

🧩 多工具协作实战示例

在模型中导入数据并缓存计算结果:

from odoo import models, fields, api
from odoo.tools.cache import ormcache
from odoo.tools.safe_eval import safe_eval
from odoo.tools.float_utils import float_roundclass MyModel(models.Model):_name = 'my.model'price = fields.Float()@ormcache('self.id')def compute_taxed_price(self):return float_round(self.price * 1.13, precision_digits=2)def run_custom_eval(self, expr):return safe_eval(expr, {'price': self.price})

✅ 总结与对比

模块名主要作用应用示例
cache.pyLRU 缓存、ORM 缓存加速计算字段、视图加载
safe_eval.py安全计算表达式动态域、公式字段
convert.pyXML/CSV 数据导入安装模块数据初始化
float_utils.py浮点数比较、四舍五入金额字段处理
translate.py翻译与多语言支持字段翻译、视图翻译
config.py读取配置文件和参数启动服务、获取配置项
view_validationXML 视图语法校验提前发现视图定义错误
misc.py通用函数集合文件处理、结构操作
image.py图像二进制处理用户头像、图标裁剪
其他(appdirs等)路径、邮件、国际化等辅助各类底层通用场景

🛠️ 更多工具模块与进阶用法

除了上述主力模块,odoo/tools 目录还包含大量实用的辅助工具,覆盖路径定位、条码、邮件、国际化、SQL、性能分析、版本兼容等各类场景。常见的还有:

  • appdirs.pybarcode.pycloc.pyfunc.pyi18n.pyjson.pymail.pyosutil.pyprofiler.pyset_expression.pysql.pytemplate_inheritance.pyxml_utils.py 等。

具体可参考源码,每个模块头部和函数都有详细注释。


🔬 进阶用法与实战技巧

  • 缓存高级用法@ormcache_context 支持 context 变量参与缓存 key,log_ormcache_stats() 可输出缓存命中率,支持全局清理。
  • 安全表达式执行safe_eval 对 Python 字节码严格白名单校验,支持自定义上下文,适用于 domain、公式字段、动态规则等。
  • 浮点数精度处理float_roundfloat_is_zerofloat_repr 等专门处理 IEEE-754 浮点误差,推荐所有金额、数量等精度敏感场景都用 float_utils。
  • 数据导入与批量初始化convert.py 支持 XML/CSV/YAML 批量导入,支持 <record>, <function>, <menuitem> 等标签,idrefnoupdateeval 等机制支持跨模块引用和条件导入。
  • 杂项工具箱misc.py 提供 file_open(安全文件访问)、split_every(分块处理)、unique(去重)、formatLang(本地化格式化)、get_lang(多语言环境)等,适合各类底层场景。

💡 典型代码片段

# 使用 misc.py 的 file_open 读取模块内文件
from odoo.tools.misc import file_open
with file_open('my_module/static/description/icon.png', 'rb') as f:data = f.read()# 使用 float_utils 进行金额精度处理
from odoo.tools.float_utils import float_round
rounded = float_round(123.456, precision_digits=2)  # 123.46# 使用 safe_eval 安全执行用户表达式
from odoo.tools.safe_eval import safe_eval
result = safe_eval('price * 1.13', {'price': 100})  # 113.0

🧬 源码深度解读

1. sql.py:安全与组合式的 SQL 构建器

Odoo 的 tools.sql 提供了安全、可组合的 SQL 语句包装器 SQL 类,极大简化了动态 SQL 的拼接与参数传递,核心特性如下:

  • SQL 对象封装SQL 类将 SQL 语句和参数分离,支持嵌套组合,避免手动拼接字符串带来的 SQL 注入风险。
  • 参数化与安全:支持 %s 占位符和命名参数,所有参数都通过 psycopg2 传递,自动防注入。
  • 组合式 API:SQL 片段可以嵌套组合,SQL("%s = %s", SQL.identifier(col), val),最终统一输出 code 和 params。
  • 辅助函数丰富:如 create_indexdrop_view_if_existsindex_existsmake_identifier 等,封装了常用的表结构变更、索引管理等操作。
  • 元数据追踪to_flush 属性可追踪 SQL 依赖的字段,便于后续缓存失效等场景。

实用建议:自定义底层 SQL 操作时,优先用 SQL 类和相关工具函数,既安全又易维护。


2. lru.py:线程安全的 O(1) LRU 缓存

Odoo 的 tools.lru.LRU 是一个基于 OrderedDict 的线程安全 LRU(最近最少使用)缓存实现,特点如下:

  • O(1) 操作:所有 get/set/del 操作均为常数时间复杂度。
  • 线程安全:所有方法都加锁(@locked 装饰器),可在多线程环境下安全使用。
  • 自动淘汰:超出容量自动淘汰最久未使用的元素。
  • API 兼容字典:实现了 MutableMapping,可像普通字典一样用。
  • 用法场景:被 ORM 缓存、视图缓存等高频场景广泛调用。

3. cache.py:ORM 缓存装饰器与统计

Odoo 的 tools.cache 是 ORM 层性能优化的核心,提供了 @ormcache@ormcache_context 等装饰器,底层依赖 LRU 实现。主要机制:

  • @ormcache 装饰器:为模型方法提供参数化缓存,缓存 key 可灵活指定(如 @ormcache('self.env.uid', 'self.env.cr.dbname'))。
  • @ormcache_context:支持 context 变量参与缓存 key,适合多租户/多语言等场景。
  • 缓存统计ormcache_counter 统计命中/未命中/错误/耗时,log_ormcache_stats() 可输出全局缓存命中率。
  • 缓存清理:通过 model.pool.clear_all_caches()registry.clear_cache() 清理所有缓存。
  • 兼容性与安全:装饰器自动处理参数、兼容老用法,且不允许缓存 Recordset(避免游标失效)。

4. mail.py:邮件与 HTML 处理工具箱

Odoo 的 tools.mail 是邮件和富文本处理的"瑞士军刀",涵盖邮件地址解析、HTML 清洗、内容格式化等,主要亮点:

  • 邮件地址处理email_normalizeemail_splitemail_domain_extract 等,支持国际化、去重、批量处理。
  • HTML 安全清洗html_sanitizehtml_normalizehtml2plaintext,基于 lxml,支持自定义白名单、样式过滤、条件注释保留等。
  • 富文本与纯文本互转plaintext2htmlhtml2plaintext,适合邮件正文、通知等场景。
  • 邮件追踪与格式化:如 generate_tracking_message_idformataddrencapsulate_email,支持邮件头生成、地址封装等。
  • 健壮性与兼容性:对各类邮件客户端、特殊 HTML 标签、国际化邮箱等做了大量兼容处理。

📚 参考与源码

更多细节可参考 Odoo 源码的 odoo/tools 目录,每个模块头部和函数都有详细注释。




http://www.hkcw.cn/article/vHdCFRxKqt.shtml

相关文章

如何在矩池云实例上开启应用服务的访问端口

AI 应用开发越来越火热&#xff0c;矩池云平台上也相应出现了越来越多的 AI 应用开发者&#xff0c;这里详细介绍下大家在使用过程中经常遇到的一个问题&#xff1a;在矩池云的实例上&#xff0c;如何为应用服务开启外部可访问的端口&#xff1f; 根据开发者有没有启动实例&…

首发支持! 基于昇腾MindIE玩转InternVL3多模态理解最新模型

2025年4月16日&#xff0c;上海人工智能实验室&#xff08;上海AI实验室&#xff09;升级并开源了通用多模态大模型书生万象3.0&#xff08;InternVL3&#xff09;。通过采用创新的多模态预训练和后训练方法&#xff0c;InternVL3 多模态基础能力全面提升&#xff0c;在专家级基…

深入解析Java8核心新特性(Optional、新的日期时间API、接口增强)

文章目录 前言一、Optional&#xff1a;优雅处理null1.1 Optional设计哲学1.2 Optional基础操作1.3 Optional链式操作1.4 高级应用1.5 Optional实战案例 二、新的日期时间API&#xff1a;解决历史痛点2.1 java.time 设计哲学与核心架构2.2 核心类详解与使用基本日期时间类时区相…

深入理解C#中的委托与事件:从基础到高级应用

在C#编程语言中&#xff0c;委托和事件是两个强大且独特的特性&#xff0c;它们为方法封装、回调机制和事件驱动编程提供了语言级别的支持。作为.NET框架的核心组件&#xff0c;委托和事件广泛应用于Windows Forms、WPF、ASP.NET等各类应用程序中。本文将全面探讨委托与事件的概…

设备制造行业项目管理难点解析,如何有效解决?

在设备制造行业&#xff0c;项目管理是企业运营的核心环节&#xff0c;直接影响项目交付效率、成本控制和盈利能力。然而&#xff0c;由于行业特性复杂、项目周期长、涉及部门多&#xff0c;企业在实际操作中常常面临诸多管理痛点。金众诚工程项目管理系统&#xff0c;依托金蝶…

如何应对客户对项目进度的过度干预

当客户对项目进度进行过度干预时&#xff0c;企业应采取明确项目边界、建立透明沟通机制、提升客户信任感、提供详实进度报告等措施。其中&#xff0c;明确项目边界尤为关键&#xff0c;它能有效帮助企业和客户共同确认项目的权责范围&#xff0c;防止客户的过度干预影响项目整…

11:QT界面设计—模态UI对话框

1.模态UI对话框 1.创建dialog的界面模板 2.进行模板界面设计 3.在主程序调用此界面 需要包含此类和实例化此类&#xff0c;然后调用下面的程序m_pShapeMatch->setModal(false); //如果改为true&#xff0c;则弹出对话框之后无法进行其它操作m_pShapeMatch->show(); 2.…

重温经典算法——选择排序

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 基本原理 选择排序属于简单的原地排序算法&#xff0c;通过将待排序序列分为已排序和未排序两部分&#xff0c;每次从未排序部分选择最小元素&#xff0c;与未排序部分的起…

RFID测温芯片助力新能源产业安全与能效提升

在“双碳”目标驱动下&#xff0c;新能源产业正经历爆发式增长。无论是电动汽车、储能电站还是风光发电场&#xff0c;设备安全与能效提升始终是行业核心命题。而温度&#xff0c;这个看似普通的物理参数&#xff0c;却成为破解这一命题的关键密码。RFID测温芯片&#xff08;集…

数据的类型——认识你的数据

第02篇&#xff1a;数据的类型——认识你的数据 写在前面&#xff1a;嗨&#xff0c;大家好&#xff01;我是蓝皮怪。在上一篇文章中&#xff0c;我们聊了统计学的基本概念&#xff0c;今天我们来深入了解一个非常重要的话题——数据的类型。你可能会想&#xff1a;"数据就…

【JVM】初识JVM 从字节码文件到类的生命周期

初识JVM JVM&#xff08;Java Virtual Machine&#xff09;即 Java 虚拟机&#xff0c;是 Java 技术的核心组件之一。JVM的本质就是运行在计算机上的一个程序&#xff0c;通过软件模拟实现了一台抽象的计算机的功能。JVM是Java程序的运行环境&#xff0c;负责加载字节码文件&a…

WebVm:无需安装,一款可以在浏览器运行的 Linux 来了

WebVM 是一款可以在浏览器中运行的Linux虚拟机。不是那种HTMLJavaScript模拟的UI&#xff0c;完全通过HTML5/WebAssembly技术实现客户端运行。通过集成CheerpX虚拟化引擎&#xff0c;可直接在浏览器中运行未经修改的Debian系统。 Stars 数13054Forks 数2398 主要特点 完整 Lin…

动态规划-931.下降路径最小和-力扣(LeetCode)

一、题目解析 从最顶上出发&#xff0c;有三个位置选择&#xff0c;左中下(边界除外)&#xff0c;使其走到最下面时下降路径最小。 二、算法原理 1、状态表示 我们需要的是到达[i,j]的最小路径和&#xff0c;所以此时dp[i][j]表示&#xff1a;到达[i,j]位置时&#xff0c;最…

ssm学习笔记(尚硅谷) day1

创建新项目 maven的聚合 1. 标记父类项目 标签<packaging>pom</packaging>表示将该项目标记为父类项目&#xff0c;必须添加。 以下是标签<packing>的常见取值 groupId在pom.xml中&#xff0c;可以从pom.xml直接修改。 2. 通过<modules>添加子项目…

数据库 | 时序数据库选型

选型目标 高性能与低延迟&#xff1a;满足高频率数据写入与即时查询的需求。资源效率&#xff1a;优化存储空间使用&#xff0c;减少计算资源消耗。可扩展架构&#xff1a;支持数据量增长带来的扩展需求&#xff0c;易于维护。社区活跃度&#xff1a;有活跃的开发者社区&#…

Linux | Shell脚本的基础知识

一. 定义 1.1 什么是shell脚本 shell脚本是一种可运行的文本shell脚本的内容是由逻辑和数据组成shell脚本是解释型语言 命令不可单独执行&#xff0c;由解释器将代码转换为系统指令&#xff0c;系统接受指令后执行速度比编译型语言慢&#xff0c;优点是简单&#xff0c;开发效…

Window Server 2019--09 路由和桥接的设置

本章要点 >>了解路由器工作原理。 >>掌握路由与远程访问服务的设置。 >>掌握桥接的设置。 路由器(Router)是网络中的核心设备&#xff0c;它工作在开放系统互连(Open SystemInter- connection&#xff0c;OSI)网络参考模型的网络层(第3层),用于连接多个在…

国芯思辰| 霍尔电流传感器AH811为蓄电池负载检测系统安全护航

在电动车、储能电站、不间断电源&#xff08;UPS&#xff09;等设备中&#xff0c;蓄电池作为关键的储能单元&#xff0c;其运行状态直接关系到设备的稳定性和使用寿命。而准确监测蓄电池的负载情况&#xff0c;是保障其安全、高效运行的关键。霍尔电流传感器 AH811凭借独特的技…

如何构建高效的接口自动化测试框架(全)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在选择接口测试自动化框架时&#xff0c;需要根据团队的技术栈和项目需求来综合考虑。对于测试团队来说&#xff0c;使用Python相关的测试框架更为便捷。无论选择…

Redis Stack常见拓展

Redis JSON RedisJSON 是 Redis Stack 提供的模块之一&#xff0c;允许你以 原生 JSON 格式 存储、检索和修改数据。相比传统 Redis Hash&#xff0c;它更适合结构化文档型数据&#xff0c;并支持嵌套结构、高效查询和部分更新。 #设置⼀个JSON数据,其中$表示JSON数据的根节点…