odoo包含的服务有
- Report
- Workflow
- XML-RPC
- Http web
Odoo9之后改用http方式启动服务,为了保持兼容性,还是保持了旧模式,在 openerp/netsvc.py 定义为 LocalService
?
?
openerp/cli/main() 函数为odoo的入口,
定义在 openerp/cli/command.py,此函数根据cli命令带的参数
判断运行哪个命令,
命令可能是
- deploy
- scaffold
- server
- shell
- start
如果不给出 command,则使用
默认command server.
?
?
启动前准备工作
- 检查是否是 root用户
- 实例化配置文件
- 检查pg用户
- 报告配置情况
- 检查是否设置 preload database,如果有,则创建空数据库
- 创建 pid 文件
- 启动 openerp.service.server
?
?
openerp.service.server启动过程
- 定义全局变量 server
- 装载
全服务器模块 load_server_wide_modules(),默认是 web 和 web_kanban,可以通过 server_wide_modules 配置项设置更多的
预装载模块。
运行 openerp.modules.module.load_openerp_module 装载web 和web_kanban 模块。此时,仅仅将这些模块当作 pyton 模块处理,并不执行任何的 ORM过程 - 根据 configuration 启动对应的服务器,odoo支持3种服务器模式
- GeventServer
- PreforkServer
- ThreadedServer
- 如果设置了 workers 参数,
则是 preforkserver, 默认是 threadserver。然后根据配置 执行RegistryManager.new() 装载 preload 指定的数据库,和指定的模块。 odoo实例为每个数据库维护一个 registry,用来维护模块注册。使用RegistryManager 管理 registry,在 new()时, 使用openerp.modules.load_modules()加载odoo模块; 此时,不仅将odoo模块作为Python模块导入, 并执行ORM过程。?
?
装载odoo模块以及ModelClass构建
py文件 openerp\modules\loading.py
步骤
- 初始化系统路径
- 检查数据库是否初始化,否则
初始化数据库,使用 openerp\addons\base\base.sql - 初始化
模块graph,将base 添加到
图 - 执行 load_module_graph() 装载 base 模块;
初始化
注册表
和迁移管理器,执行
迁移脚本,以及odoo模块定义的 pre_init_hook ,导入odoo模块,更新 models.MetaModel.module_to_models[ ],使用 registry.load() 加载 odoo 模块。
registry.load() 首先导入 models.py, 然后 遍历 models.MetaModel.module_to_models[ ] 登记的 python class,然后执行 models.BaseModel._build_model() 基于 python class 动态 建立 oodo model class, odoo model class 将 按照 graph 里面的依赖顺序,依次继承 python class 构建 odoo model class. 例如, <class ‘openerp.addons.stock.product.product_template‘> 在 ORM 时, 将通过 depends graph 遍历出 全部的 父类【inherit[s]】,再加上它自己 ,例如 <type ‘list‘>: [<class ‘openerp.addons.stock.product.product_template‘>, <class ‘openerp.addons.sale.sale.ProductTemplate‘>, <class ‘openerp.addons.account.models.product.ProductTemplate‘>, <class ‘openerp.addons.product.product.product_template‘>, <class ‘openerp.addons.mail.models.mail_thread.MailThread‘>], 然后 基于这些 基类, 使用 type() 构建出 odoo model class. 【<class ‘openerp.api.product.template‘> 】 和 odoo model 【 template: product.template 】
时间: 2024-10-14 11:17:39