You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现慢加载Python Odoo模块的后台导入,仅需时等待?

解决方案:延迟初始化Odoo连接

核心思路是把Odoo连接的初始化逻辑从模块导入阶段推迟到实际使用时执行,也就是懒加载。下面是两种可行的实现方式:

方法一:函数封装懒加载

修改odoo.py,将连接初始化逻辑封装到函数中,仅在第一次调用时建立连接:

import odoorpc
from .env import ENV

# 私有变量存储已建立的连接
_odoo_connection = None

def get_odoo_connection():
    global _odoo_connection
    if _odoo_connection is None:
        # 仅在首次调用时执行连接逻辑
        _odoo_connection = odoorpc.ODOO(ENV["ODOO_HOST"], port=ENV["ODOO_PORT"])
        _odoo_connection.login(
            db=ENV["ODOO_DB"], 
            login=ENV["ODOO_USR"], 
            password=ENV["ODOO_PWD"]
        )
    return _odoo_connection

然后修改调用该连接的模块(比如category.py),在需要使用Odoo连接时调用函数:

from mongoengine import *
from .odoo import get_odoo_connection


class Category(DynamicDocument):
    name = StringField(required=True)
    odoo_id = StringField()

    def publish(self):
        # 仅调用publish时才会触发连接初始化
        odoo = get_odoo_connection()
        _model = odoo.env["product.category"]
        self.odoo_id = _model.create({"name": self.name})
        self.save()

方法二:单例类封装连接

如果需要更面向对象的实现,可以用单例类来管理Odoo连接:
修改odoo.py:

import odoorpc
from .env import ENV

class OdooConnector:
    # 类变量存储单例实例
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
            # 首次实例化时建立连接
            cls._instance._init_connection()
        return cls._instance

    def _init_connection(self):
        self.connection = odoorpc.ODOO(ENV["ODOO_HOST"], port=ENV["ODOO_PORT"])
        self.connection.login(
            db=ENV["ODOO_DB"], 
            login=ENV["ODOO_USR"], 
            password=ENV["ODOO_PWD"]
        )

    @property
    def env(self):
        return self.connection.env

修改category.py中的调用:

from mongoengine import *
from .odoo import OdooConnector


class Category(DynamicDocument):
    name = StringField(required=True)
    odoo_id = StringField()

    def publish(self):
        # 首次调用时初始化连接
        connector = OdooConnector()
        _model = connector.env["product.category"]
        self.odoo_id = _model.create({"name": self.name})
        self.save()

原理说明

原来的代码在导入odoo.py时,会直接执行模块顶层的连接初始化代码,导致每次导入都要等待10秒的连接建立时间。而懒加载的方式将连接逻辑放到函数/类的内部,只有当实际调用publish方法(也就是真正需要使用Odoo连接时)才会执行初始化,完全避免了无用的等待时间。

内容的提问来源于stack exchange,提问作者masavini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 23:15:49