Alan Hou的个人博客

第二章 Odoo 15开发之开发环境准备

在更深入学习 Odoo 开发之前,我们需要配置好开发环境并学习相关的基础管理任务。

本章中,我们将学习如何配置构建 Odoo 应用所需的环境。我们会配置一个Ubuntu 系统来托管开发服务端实例。可以使用云服务器、本地服务器或者Windows 10上的子系统。

学习完本章后,读者可以掌握如何准备开发环境、通过源码运行Odoo以及在同一台机器上拥有多个Odoo项目和多个Odoo版本。读者还会学习Odoo的服务端是如何运行的,以及在开发过程中如何使用它们。

本文章主要讲解如下内容:

本章的第一步为检查是否满足本章的技术要求以及配置主机稍后安装Odoo。

开发准备

本章中,我们在Ubuntu 20.04操作系统上使用源码安装 Odoo。只需要使用终端环境,无需Ubuntu的图形化用户界面。

如果读者手上没有Ubuntu 20.04系统,也可以使用Windows 10主机。我们可以使用Windows 的Linux 子系统,在Windows系统中获取到Ubuntu环境。

本章的相关代码参见配套的GitHub仓库的ch02/目录中。

设置 Odoo 服务宿主机

推荐使用Debian/Ubuntu来运行 Odoo 服务,这也是参考部署平台。Odoo 自己的 SaaS 平台也运行在 Debian 之上,这也是社区中最主流的选择。也就是说使用Debian 或 Ubuntu 会更容易寻求到帮助或建议。

:开发、运行Odoo还可以选择Odoo.sh服务。它提供了基于Git的开发工作流并提供了需用于运行生产系统的所有补充服务,如发送、接收邮件。如果读者对此感兴趣,Odoo官方文档中有很完善的介绍。

如果已有Ubuntu 20.04,就可以开始学习了。只需要确定是否进行了提权以执行必要的安装步骤。在终端中运行如下命令进行检查。如若成功,即可进入后面的学习:

如果使用的是Windows,最简单的方案是使用WSL。在下一节我们会进行讲解。

如果这个方案对你不可用,还可以使用虚拟机。我们不会详细讲解,但下面两点会有帮助:

TurnKey Linux提供了几种平台上易于使用的预安装镜像,包含ISO。ISO格式可用于所有的虚拟化软件,甚至可用在裸机上。LAPP镜象是一个不错的选择,它包含Python和PostgreSQL。可访问http://www.turnkeylinux.org/lapp

使用 Windows 子系统安装 Linux

2020年3月,自Windows 10的2004版本起就支持了更具鲁棒性的Linux子系统(WSL2 – Windows Subsystem for Linux2)。通过子系统,我们可以在 Windows 内运行 Ubuntu 系统,足以应对 Odoo 开发所需的一切。更多 WSL2 相关知识请参考官网

WSL 是Windows 10中的一个可选功能,使用前需要先启用。具体如何操作参见官方帮助文档

然后应该就能安装Ubuntu Windows应用了。打开Windows应用商店搜索Ubuntu。在写本书时,最新的Ubuntu LTS(长期支持版本)为20.04。根据安装流程进行操作,设置用户账号及相应的密码。

运行Ubuntu应用会打开Linux命令行窗口,在其中可输入Ubuntu命令。记录下在安装Ubuntu时配置的用户名和密码,因为在使用sudo进行提取操作时都会要求输入密码信息。

现在就有了可使用的Debian系操作系统,我们可以开始安装Odoo和依赖了,还有PostgreSQL数据库。

源码安装 Odoo

Odoo使用Python 编程语言,数据存储使用 PostgreSQL数据库。通过源码运行Odoo,我们需要安装其所依赖的Python库。然后在GitHub上下载Odoo源代码。使用Git仓库的方案优于下载源代码ZIP或tar文件。使用Git我们可以控制代码版本,对于发布流程它也是一个很好的工具。

注:具体依赖的安装根据操作系统和安装的 Odoo 版本可能会不同。如果在上述步骤中出现问题,请参考官方文档。可切换版本查看其它版本的操作步骤。

安装 PostgreSQL 数据库

Odoo 要使用到 PostgreSQL服务,典型的开发设置是使用安装 Odoo 的同一台机器安装PostgreSQL。

运行如下命令在Debian/Ubuntu系统中安装PostgreSQL数据库:

最后这条命令为当前系统用户创建一个PostgreSQL用户,用于 Odoo 实例创建或删除数据库时使用。

如果在 WSL内运行 Ubuntu,注意系统服务不会自动启动。也就是说运行任何需要数据库连接的命令(如createuser或启动 Odoo 服务)时都要手动开启PostgreSQL服务。手动启动PostgreSQL服务执行如下命令:

安装 Odoo 系统依赖

运行 Odoo需要一些系统库。获取版本控制的源码应安装 Git,安装运行Odoo 15要求 Python 3.7或之后的版本。以下为所需要的基本系统依赖:

Odoo 12中的变化

CSS预处理器由less 改成了 Sass。也就是说运行Odoo不再需要使用less。Odoo 9-11版需要使用less预处理器。

如果需要使用11及之前版本,则还需要安装less:

源码安装 Odoo

为便于管理,我们将在家目录下创建一个/work15目录作为工作目录。在本系列文章中我们均预设 Odoo 代码安装在该目录下。

Odoo 15 使用的是 Python 3(3.6或之后的版本),也即在命令行中我们不使用python和pip,而是用python3和 pip3。

Odoo 11的修改
从版本11开始,Odoo 运行在 Python 3之上,Odoo 11依然支持 Python 2.7,但 Odoo 12仅能运行在Python 3.5+的环境中。Odoo 10及之前的版本仅可运行在Python 2.7中。

要通过源码安装 Odoo,我们首先要从 GitHub 上直接克隆一套 Odoo 源代码:

~符号是用户家目录的简写,比如/home/alan。如果使用Windows 10的WSL子系统,可通过在文件浏览器中打开\\wsl$找到该目录。该工作目录的完整路径类似于\\wsl$\Ubuntu-20.04\home\daniel\work15

Git命令中的-b 15.0明确表明要下载 Odoo 15.0分支。在写本文时,这显得有些多余,因为这正是当前默认的分支,但以后会变化。

--depth=1告诉Git下载最近的修订版本,而不是所有的历史修改,这会使下载更快、内容更少。

小贴士:如需在获取下载后提交的内容,可以运行git fetch –unshallow。可以只获取近期的更新。git fetch –depth=100会下载最新100个提交,而git fetch –shallow-since=2020-01-01会获取所有2020年1月1日之后的所有提交。

接下来,我们应当安装在requirements.txt中所声明的 Python 依赖。推荐在Python虚拟环境中进行安装。这样会保护Odoo环境不受系统级Python库更新的影响。另一个好处是可以根据所需操作的具体项目保留多个虚拟环境,比如我们使用更老的Odoo版本。下面就开始实操吧:

  1. 执行如下命令新建虚拟环境:

    这会在~/work15/env15目录中创建一个Python环境。
  2. 我们希望使用~/work15/env15/bin/python运行所有Python代码。以下命令可显示所安装的Python版本以进行确认:
  3. 如若将其设为当前默认Python解释器使用势必更轻松。可通过如下命令启用虚拟环境:

一旦我们启用了虚拟环境,命令行会发生变化,包含所启用环境的信息。本例中会由$变为(env15) $

可运行which命令来确定所使用的为正确的Python解释器:

仅需运行deactivate来禁用掉虚拟环境;此时Python解释器就会变回系统默认:

在执行下述命令前请重新启用虚拟环境。

启用虚拟环境后,可以运行如下命令来安装Python依赖:

注:在虚拟环境中,直接使用pythonpip命令即可指向正确的版本。在操作系统默认环境中则并非如此,pip指向Python 2,而pip3指向Python 3。如需在系统层面运行这些命令,请将pip替换为pip3,因为Odoo使用Python 3。

一些Python库要求安装系统二进制文件。如无法安装一些库,请确认已按照本章中安装 Odoo 系统依赖一节安装系统依赖。

现在已安装了Python依赖库。但仍需要安装Odoo自己。可使用pip来安装:

-e选项用于进行Python可编辑安装。这样~/work15/odoo目录中的源码文件可用于运行Odoo。若不添加这一选项,安装流程会将源码目录中的代码文件拷贝至site-packages/目录中,然后运行这些拷贝,这样源码的修改或更新均无法体现出来。

运行Odoo

运行 Odoo 首先要启用相应的虚拟环境:

在虚拟环境内,只需要运行Odoo来启动实例:

odoo命令是简便的快捷方式,在本书中会经常使用到。同时了解一下还可以通过调用相应的可执行命令来启动Odoo:

要进行更完整的控制,可以使用指定的Python可执行路径来运行Odoo,这时就无需激活虚拟环境了:

运行Odoo时如果不添加--version选项,就会一直运行,等待客户端调用。

Odoo默认监听的端口是8069。应使用http://localhost:8069在浏览器中访问Odoo服务。

如需停止服务并返回命令行,按快捷键Ctrl + C

通过web客户端新建数据库

首次访问Odoo时,因为还没有数据库,我们会在辅助页面中新建数据库。默认配置下,通过http://localhost:8069:访问Odoo:

图2.1:数据库创建表单

数据库创建表单中要求填写的信息如下:

注意:

管理员(admin)密码和主控(master)密码是不同的概念。主控密码用于管理数据库,可进行备份、还原及拷贝Odoo数据库。管理员密码是默认管理员登录的密码,具有配置Odoo数据库和管理用户的权限。

在点击创建数据库(Create database)按扭后,会新建数据库并进行初始化,这会花费一些时间。准备就绪后,会重定向至登录界面。

可通过登录页面底部的管理数据库(Manage databases)进入数据库管理页面。这个管理页面显示当前的数据库列表,并可对其备份、拷贝或删除,同时也可新建数据库。

也可直接访问http://localhost:8069/web/database/manager.进入数据库管理页面。

注:

数据库管理页面可进行一些高权限的管理操作,默认启用且没有密码保护。虽然方便,但这是一个安全威胁。请考虑使用一个复杂的主控密码或最好关闭这一功能。主控密码在Odoo配置文件中进行设置,内容为admin_passwd = <your-complex-password>。可在配置文件中添加list_db = False禁用数据库管理页。参见配置Odoo 服务端参数一节了解有关配置文件的详情。

通过命令行新建数据库

我们作为开发者,会需要使用到多个数据库。通过命令行创建会更为便捷。

如果终端窗口中运行着Odoo,请按下Ctrl + C 进行停止回到命令行。

加选项-d选项运行Odoo服务可创建并初始化Odoo数据库:

初始化15-demo数据库需要些时间,完成后会回到命令行。

如果省去--stop-after-init选项,在数据库就绪后Odoo服务会保持为运行状态。这时仔细看下日志消息里的带有Modules loadedINFO日志行。这表示已完成数据库的启动,可接受客户端的调用了。注意这可能不是最后一条日志消息,大概会在最后的3到4行之中。

默认,数据库初始化时会带有演示数据,这有助于进行开发。与在用户界面新建数据库时勾选Load demonstration data的效果一致。

可在odoo命令后添加--without-demo=all初始化不带演示数据的空数据库。

要新建数据库,运行Odoo的用户必须是PostgreSQL的超级用户。如果不是,请查看使用源码安装 Odoo一节。

小贴士:

在开发环境中使用数据库超级用户来运行Odoo实例没什么问题。但在线上环境中,Odoo安全最佳实践要求使用非数据库超级用户运行Odoo服务。

现在可运行的实例和数据库都已就位。在浏览器中打开http://localhost:8069,应该就可以进入到Odoo登录页面了。

如果不确定URL中该使用什么主机名和端口,可查看Odoo服务日志消息。在启动日志的前几行应该会包含这一信息。类似于:

Linux中也可以使用hostname命令来查找主机名,或使用ifconfig命令来查找IP地址。

Odoo的默认管理员账号为admin,密码也是admin。登录后如果尚未在数据库中安装应用,会看到Apps菜单,显示可进行安装的应用。

可在运行Odoo服务端的终端窗口按下Ctrl + C 停止实例,返回命令行。按向上键会出现刚刚使用的shell命令,这样可快速使用相同选项两次启动Odoo。按下Ctrl + C ,再按向上键和Enter,这是在开发时重启Odoo服务的常用组合键。

至此,Odoo已在系统中成功安装、等待使用,Odoo实例的数据库也已准备好。接下来,我们学习如何管理数据库,新建数据库并删除那些不再需要的数据库。

管理 Odoo 数据库

前面我们学习了如何通过命令行新建和初始化 Odoo 数据库。管理数据库还有更多的命令值得我们学习。

虽然 Odoo 服务可以自动新建PostgreSQL数据库,我们还是可以使用如下命令来手动创建 PostgreSQL 数据库:

这一命令配合--template 参数可拷贝已有数据库。被拷贝的数据库不能处于连接状态,所以在进行这一操作时要确保 Odoo 实例已停止。

小贴士:

在WSL中运行PostgreSQL时,有些操作可能会显示类似WARNING:  could not flush dirty data: Function not implemented.的消息。可通过修改PostgreSQL配置文件绕过这一问题。对于PostgreSQL 12,配置文件位于/etc/postgresql/12/main/postgresql.conf。编辑该文件添加两行,fsync = off 和 data_sync_retry = true。然后使用sudo server posgresql restart重启PostgreSQL服务。

使用如下命令将MyDBName原始拷贝至MyDBCopy

使用PostgreSQL的psql工具添加-l参数查看已有数据库:

这会列出截至目前所创建的数据库。如果执行了前面的命令,应该会列出MyDBNameMyDBCopy。这个列表还会包含每个数据库的编码。默认为UTF-8,这也正是Odoo数据库所需要的编码格式。

如需删除不再使用(或希望重建)的数据库,执行dropdb命令:

现在我们已学习了数据库的基本知识。要了解更多 PostgreSQL的知识,请参见官方文档psql文档页面

警告:dropdb命令进行的数据删除不可撤销。在对重要数据库执行该命令时请务必备份数据库。

至此我们的Odoo成功运行并且也已知道如何管理项目的数据库或进行试验。但还需要学习最相关的一些Odoo服务端配置参数,以及如何便利地在配置文件中进行存储。

配置 Odoo 服务端参数

Odoo 服务还支持一些其它参数,可通过--help 来查看所有可用参数:

我们在下面的部分将会学习一些重要参数。首先我们先学习如何使用配置文件。

Odoo 服务端配置文件

大多数的参数都可以保存到配置文件中。默认 Odoo 使用.odoorc文件。Linux 系统中缺省的路径是在家目录($HOME)中,而在 Windows 中则和运行 Odoo 的可执行文件放在同一个目录中。

注:在老版本的 Odoo/OpenERP 中,默认的配置文件为.openerp-serverrc。为保持向后兼容,存在该文件且没有.odoorc的情况下会使用该文件。

全新的安装中不会自动创建.odoorc配置文件,我们应使用--save参数来存储当前实例的配置,如果配置文件不存在则会创建默认配置文件:

这里使用的--stop-after-init参数在执行结束后停止服务。

注:命令行参数可以缩短到保持不引起混淆的程度,如--stop-after-init可缩写为--stop

现在可以通过如下命令来查看配置文件中的默认内容:

以上命令会显示所有配置项及默认值。参数的编辑在下一次启动 Odoo 实例后生效。输入 q 退出,回到命令行。

使用--conf=<filepath>或等效的-c <filepath>短标记参数来指定配置文件。

例如,如下命令在~/work15目录中新建一个配置文件15-demo.conf

如下命令使用该配置文件启动Odoo服务:

修改监听端口

Odoo服务端默认使用8069端口。要使用其它端口,可以使用--http-port=<port>参数或使用其简短形式-p <port>。在同一台机器上同时运行多个实例这会很有帮助。

Odoo 11的修改:在 Odoo 11中引入--http-port参数以替代此前版本使用的--xmlrpc-port

下面就可以做个尝试。打开两个终端,第一个中输入命令:

第二个中输入命令:

此时就在同一台机器上使用不同端口运行了两个 Odoo 实例,这两个实例可以使用同一个数据库或不同数据库,这取决于我们使用的配置参数,并且两个端口上也可以运行相同或不同版本的 Odoo。

小贴士:不同 Odoo 版本必须使用不同的数据库。尝试在不同版本上使用相同数据库将无法正常运行,因为各大版本采用了不兼容的数据库模式。

过滤可访问的数据库列表

--database-d参数设置Odoo服务端实例使用的数据库。对该服务端的所有调用都会使用这个数据库,并且对其它数据库的调用都会被拒绝。这种情况发生于Odoo服务端重启使用另一个数据库,而网页窗口中打开的页面还在使用前一个数据库的会话。

同一个Odoo服务端可以使用多个数据库。这是未选取数据库时的默认行为(在命令行、配置文件及默认配置~/.odoorc中均未设置--database参数)。这时新的浏览器会话会打开数据库管理页面,让我们选取想要使用的数据库。

如果未指定使用的数据库,那么所有的数据库均会出现。使用--db-filter参数会限定Odoo服务端可使用的数据库。

--db-filter的值可以是一个逗号分隔的数据库名列表或常规表达式。例如,过滤出15-demo名称的表达式为:

下面是一些常用正则表达式的示例:

管理服务端日志消息

默认Odoo在标准输出中打印服务端日志消息,因而在终端窗口中打印。

下面是一行日志的示例:

每行日志遵循一个包含如下列的结构:

剩下的文本记录消息的内容。

HTTP请求的消息文本有一个特定的结构,由werkzeug模块处理。如下例:

这里我们可以看出做出HTTP请示的详情,包含源IP地址、调用的端点以及HTTP状态码。

还可以看到性能信息,位于文本消息的最后:最后面的3个数字。上例中为213 0.135 0.092。这些性能数字的含义为:

对于日志,我们可以控制两个配置:日志在哪里输出以及日志的信息量。

--log-level用于控制日志的信息量。默认设置为info级别。

减少日志信息量,可以将日志级别设置为如下的一种:

提升日志级别有助于了解服务端的一些问题。还有如下信息量更大的日志级别:

通过对服务启动命令添加参数在测试不同的日志级别,如下例所示:

然后,浏览网页端的一些页面,查看服务端日志中有何不同。

--log-handler让我们可以更精细地对具体模块设置日志级别。使用的格式为--log-handler=MODULE1:LEVEL,MODULE2:LEVEL,...。一种找到、确定应使用的模块名称的方式是查看已写入日志中的消息。日志级别可为DEBUGINFOWARNERRORCRITICAL(均为大写)。

例如,将加载模块日志消息提升为debug,使用如下命令:

降低HTTP请求处理的日志信息量,使用如下命令:

有关日志输出的位置,默认重定向至标准输出(终端界面),但也可定向至日志文件。可使用--logfile=<filepath>实现,如下:

注: Linux系统中,日志文件一般放在/var/log目录中。因此Odoo的日志文件通常位于var/log/odoo/

现在我们知道了如何控制Odoo实例以及重要的服务端参数,意味着我们可以做一些更深度的操作了。社区提供的Odoo模块可以让我们受益良多,因为一个关键的技能是学会如何在Odoo实例中使用这些模块。

查找、安装社区插件

Odoo生态有一个丰富的社区,具有大量的模块。在Odoo实例中安装新模块通常让初学者困扰。但完全不必如此。

查找社区模块

Odoo应用商店是一个模块目录,可以下载模块并安装到系统中。

另一个重要的资源是Odoo 社区联盟(OCA – Odoo Community Association),托管社区维护的模块。这些模块托管在 GitHub 上,地址为https://github.com/OCAhttps://odoo-community.org/shop提供了一个可搜索的索引。

OCA 是一个协调社区贡献、提升软件质量、推广最佳开发实践和开源价值观的非营利组织。可通过https://odoo-community.org进下了解OCA。

为 Odoo 添加模块,仅需将其拷贝到官方插件所在的 addons 文件夹中即可。前例中插件目录位于~/work15/odoo/addons/。但这不是一个好的实践。我们安装的 Odoo 是由 Git 版本控制的代码仓库,我们希望它与上游 GitHub 仓库保持同步,在其中混入外部插件会不利于管理。

避免这一问题,我们可以选取其它目录存放这些模块,让 Odoo 服务也会从这些目录中查找模块。我们不仅可以把自定义模块放在一个不同的目录下不与官方的混在一起,还可以通过不同目录组织这些模块。

我们可以通过下载系统课程的代码来准备供 Odoo 安装的插件模块,获取 GitHub 上的源码,执行如下命令:

这会将工作目录切换至~/work15,将本书GitHub仓库中的代码下载至library/ 子目录。接下来需要告知Odoo新模块所在的目录。

配置插件(add-ons)路径

Odoo的addons_path配置参数列出服务端查找模块的目录。默认,它指向两个目录:一个是包含base模块的服务端内部代码,另一个是插件目录,其中包含标准模块和应用。对于本文接下来的配置,应为~/work15/odoo/odoo/addons,~/work15/odoo/addons

我们使用包含新模块目录的插件路径启用服务端:

以上命令确保我们位于工作目录中,且激活了Python虚拟环境。然后,Odoo使用了两个选项进行启动:Odoo所使用的数据库名15-library,以及所使用的插件路径。为简化信息,这里使用了相对路径。

服务启动后,仔细看下日志的前几行。应当会有一条日志消息报告所使用的插件路径,类似于INFO ? odoo: addons paths: […]。确认其中包含 library/ 目录;

图2.2:包含所使用插件路径的 Odoo启动序列日志消息

现在学习了如何对Odoo实例添加第三方模块,并期望能开发自己的模块。有几个Odoo服务端参数可以助力开发。在开始编码前进行了解会很有益。

使用服务端开发模式

Odoo还提供了服务端开发模式,可使用--dev=all参数启用。

开发模式开启了几个加速开发周期的特性:

--dev=all参数在抛出异常时会调出pdb Python 调试器。有助于对服务端错误进行后期分析。有关Python调试命令的更详细内容参见https://docs.python.org/3/library/pdb.html#debugger-commands

--dev参数可接收一个逗号分隔的参数列表,虽然all参数在大部分情况下都适用。默认使用的Python调试器为pdb。这个调试器略有点简洁,还有其它的调试器可用。支持的外部调试器有pdbpudbwpdb

要在监测到代码文件修改后进行自动重新加载,必须要安装watchdog Python包:

有关调试器的使用会在第八章 Odoo 15开发之业务逻辑 – 业务流程的支持中讨论。

Odoo 命令行快查手册

以下是最重要的Odoo命令的快查手册:

小结

本章中,我们学习了如何配置Ubuntu系统来托管Odoo,以及通过GitHub源码安装 Odoo。我们还学习了如何创建Odoo数据库及运行Odoo实例。

学完本单本章读者应当有一个运行正常的Odoo环境,并且能管理数据库及Odoo实例。

至此,我们可以上正菜了。下一章中,我们会从头创建第一个Odoo模块,并掌握其包含的主要元素。

退出移动版