在前一篇文章中,我们介绍了odoo_bin脚手架的实现原理,重点是Command元类。今天我们来看看server 子命令式怎么实现的,server子命令的实现类在:
odoo\cli\server.py
class Server(Command):
"""Start the odoo server (default command)"""
def run(self, args):
odoo.tools.config.parser.prog = f'{Path(sys.argv[0]).name} {self.name}'
main(args)
Server类继承了Command父类,并实现了run方法。
odoo.tools.config.parser.prog = f'{Path(sys.argv[0]).name} {self.name}'
这一句的结果是odoo-bin server
run方法调用了main方法。
def main(args):
check_root_user()
odoo.tools.config.parse_config(args)
check_postgres_user()
report_configuration()
config = odoo.tools.config
# the default limit for CSV fields in the module is 128KiB, which is not
# quite sufficient to import images to store in attachment. 500MiB is a
# bit overkill, but better safe than sorry I guess
csv.field_size_limit(500 * 1024 * 1024)
preload = []
if config['db_name']:
preload = config['db_name'].split(',')
for db_name in preload:
try:
odoo.service.db._create_empty_database(db_name)
config['init']['base'] = True
except ProgrammingError as err:
if err.pgcode == errorcodes.INSUFFICIENT_PRIVILEGE:
# We use an INFO loglevel on purpose in order to avoid
# reporting unnecessary warnings on build environment
# using restricted database access.
_logger.info("Could not determine if database %s exists, "
"skipping auto-creation: %s", db_name, err)
else:
raise err
except odoo.service.db.DatabaseExists:
pass
if config["translate_out"]:
export_translation()
sys.exit(0)
if config["translate_in"]:
import_translation()
sys.exit(0)
# This needs to be done now to ensure the use of the multiprocessing
# signaling mechanism for registries loaded with -d
if config['workers']:
odoo.multi_process = True
stop = config["stop_after_init"]
setup_pid_file()
rc = odoo.service.server.start(preload=preload, stop=stop)
sys.exit(rc)
做了几件事:
1、检测系统用户是否为root,如果是root,则报一个预警(注意不是退出)
2、解析参数
3、检测pg用户,如果是postgres管理员账号, 报警,退出。
4、打印配置信息
2024-01-02 09:08:42,249 5180 INFO ? odoo: database: odoo@127.0.0.1:5432
5、获取到config对象
这个config对象的信息从下面连个渠道而来:
1)、odoo.conf 配置文件
2)、命令行参数
6、根据配置文件中指定的数据库名创建数据库并初始化,如果数据库已经存在,则报一个异常
从这里可以得出一个结论,那就是我们可以在配置文件中指定一个不存在的数据库,odoo自动会帮我们创建并初始化。
7、启动服务
odoo.service.server.start(preload=preload, stop=stop)
这篇文章就介绍到这,下一篇文章介绍service下的server.py文件,里面定义了三种server,包括我们最常用的ThreadServer。