阅读源码的cli模块发现一个远程部署模块的命令,在官方文档并没有说,发现隐藏功能!

解决的问题

在odoo里面写界面是很烦人的,每次写完需要重启服务器并且到app界面点击升级模块才能看到效果,用部署命令即可一条命令刷新界面效果。也就是热重载。当然,这个也可以用于安装新模块。

前提条件

odoo/cli/deploy.py 源码中可以看到,部署命令的操作是将模块文件上传在运行中的odoo执行安装操作。

def authenticate(self, server, login, password, db=''):
print("Authenticating on server '%s' ..." % server)

# Fixate session with a given db if any
self.session.get(server + '/web/login', params=dict(db=db))

args = dict(login=login, password=password, db=db)
res = self.session.post(server + '/base_import_module/login', args)
if res.status_code == 404:
raise Exception("The server '%s' does not have the 'base_import_module' installed." % server)
elif res.status_code != 200:
raise Exception(res.text)

return res.headers.get('x-csrf-token')

查找 /base_import_module/login 路由,发现在 addons/base_import_module 模块里,因此,我们需要先在web管理界面安装该模块 base_import_module

deploy命令介绍

$ odoo deploy -h
usage: odoo deploy [-h] [--db DB] [--login LOGIN] [--password PASSWORD]
[--verify-ssl] [--force]
path [url]

Deploy a module on an Odoo instance

positional arguments:
path                 Path of the module to deploy
url                  Url of the server (default=http://localhost:8069)

optional arguments:
-h, --help           show this help message and exit
--db DB              Database to use if server does not use db-filter.
--login LOGIN        Login (default=admin)
--password PASSWORD  Password (default=admin)
--verify-ssl         Verify SSL certificate
--force              Force init even if module is already installed. (will
update `noupdate="1"` records)

odoo的命令解析都是用argparse模块,因此我们在传参的时候按照默认习惯就好。

从帮助上看,部署命令的使用为 odoo deploy 模块路径 网站url –login 用户名 –password 密码

使用示例

$ odoo deploy addons/my_module http://localhost:8888 --login account@email.com --password=this_is_password
Authenticating on server 'http://localhost:8888' ...
Zipping module directory...
Uploading module file...
Successfully imported module 'my_module'

注意点

阅读 base_import_module 源码可以发现该命令只是安装或者升级模块的xml文件,并不会更新已经在运行的python代码。