当前位置:首页>python>中篇Python(ODOO)篇 第五章 与外部系统的集成

中篇Python(ODOO)篇 第五章 与外部系统的集成

  • 2026-09-10 04:17:36
中篇Python(ODOO)篇 第五章 与外部系统的集成
ODOO平台还提供了外部API,这些外部API即可以被页面调用,也可以被其他应用程序调用。在本章中,我们将会学会如何用Python使用这些外部API。
要访问ODOO的API,可以使用两种协议,XML-RPC或JSON-RPC。只要遵守两个协议中任意一种客户端程序,都可以与ODOO服务器进行交互。ODOO官方文档有WebServices一章写如何调用的例子。

(一)Python以XML-RPC方式和ODOO通讯

为了方便项目打包,我们在peijia目录新建test目录,然后新建xml_rpc_test.py
文件。我们查找官方代码,修改为查找教师休假信息,代码如下:
import functoolsimport xmlrpc.clientHOST = 'localhost'PORT = 8069DB = 'peijia'USER = 'pjdemo@163.com'PASS = '123456'ROOT = 'http://%s:%d/xmlrpc/' % (HOST, PORT)# 1. Loginuid = xmlrpc.client.ServerProxy(ROOT + 'common').login(DB, USER, PASS)print("Logged in as %s (uid:%d)" % (USER, uid))call = functools.partial(    xmlrpc.client.ServerProxy(ROOT + 'object').execute,    DB, uid, PASS)# 2. Read the sessionsdomain = [('active', '=', True,)]field_names = ['name', 'teacher_name', 'teacher_full_name', 'Holiday_begin_date', 'Holiday_end_date', 'note']holidays = call('nebula.teacher.holiday', 'search_read', domain, field_names)for holiday in holidays:    print('教师假期:', holiday)
然后我们在左上菜单中Run中点击Run ‘json_rpc_test’,后可以在Run标签页看到输出结果。
这里holidays的取值用的是偏函数方法,我们展开如下,这样看起来很清晰,但是比较繁琐。
holidays = xmlrpc.client.ServerProxy(    ROOT + 'object').execute(DB, uid, PASS,                             'nebula.teacher.holiday', 'search_read',                             domain, field_names)

(二)Python以JSON-RPC方式和ODOO通讯

我们在test目录下新建json_rpc_test.py文件。我们查找官方代码,修改为查找教师休假信息,代码如下:
import jsonimport randomimport urllib.requestHOST = 'localhost'PORT = 8069DB = 'peijia'USER = 'pjdemo@163.com'PASS = '123456'def json_rpc(url, method, params):    data = {        "jsonrpc": "2.0",        "method": method,        "params": params,        "id": random.randint(0, 1000000000),    }    req = urllib.request.Request(url=url, data=json.dumps(data).encode(), headers={        "Content-Type": "application/json",    })    reply = json.loads(urllib.request.urlopen(req).read().decode('UTF-8'))    if reply.get("error"):        raise Exception(reply["error"])    return reply["result"]def call(url, service, method, *args):    return json_rpc(url, "call", {"service": service, "method": method, "args": args})# log in the given databaseurl = "http://%s:%s/jsonrpc" % (HOST, PORT)uid = call(url, "common", "login", DB, USER, PASS)# 查找教师休假信息domain = [('active', '=', True,)]field_names = ['name', 'teacher_name', 'teacher_full_name', 'Holiday_begin_date', 'Holiday_end_date', 'note']holidays = call(url, "object", "execute", DB, uid, PASS, 'nebula.teacher.holiday', 'search_read', domain, field_names)for holiday in holidays:    print('教师假期:', holiday)
然后我们在左上菜单中Run中点击Run ‘json_rpc_test’。
在右下角点击Run,切换到Run标签页,可以看到返回了符合条件的JSON记录。

(三)Dart以XML-RPC方式和ODOO通讯

在下篇内容里,我们将用Flutter来和ODOO通讯,实现ODOO的移动化。
本节内容,读者可以在安装和设置完Flutter后再回头观看本节内容。
我们在新建一个Flutter项目,并运行成功后,按以下步骤来测试Dart连结ODOO。
1、在pubspec.yaml文件中,添加xml_rpc库,添加完毕后,点击Packages get获取相关库到本地,代码如下。
dependencies:  flutter:    sdk: flutter  # The following adds the Cupertino Icons font to your application.  # Use with the CupertinoIcons class for iOS style icons.  cupertino_icons: ^0.1.2  xml_rpc: ^0.2.4
2、清空main.dart文件,将以下代码录入。
import 'package:xml_rpc/client.dart' as xml_rpc;import 'dart:convert';//const HOST = '127.0.0.1';const HOST = '192.168.21.109';const PORT = 8069;const DB = 'peijia';const USER = 'pjdemo@163.com';const PASS = '123456';const root = 'http://$HOST:$PORT';const XML_ROOT_COMMON = 'http://$HOST:$PORT/xmlrpc/2/common/';const XML_ROOT_OBJECT = 'http://$HOST:$PORT/xmlrpc/2/object/';void main() async {  var teacherName = '';  var uID = 0;  //1.登录  try {    var result = await xml_rpc.call(      XML_ROOT_COMMON,      'login',      [        DB,        USER,        PASS,      ],    );    uID = result;  } catch (e) {    print(e);  }  //2.通过手机号查找教练ID  var domain = [    ['active', '=', 'True'],    ['mobile', '=', '186186186']  ]; //通过手机号找到教练编号,再加查询条件  var fieldNames = [    'name',    'full_name',  ];  try {    var result = await xml_rpc.call(      XML_ROOT_OBJECT,      'execute',      [        DB,        uID,        PASS,        'nebula.teacher',        'search_read',        domain,        fieldNames,      ],    );    List list = json.decode(json.encode(result));    teacherName = list[0]['name'];  } catch (e) {    print(e);  }  //3.查询假期情况  domain = [    ['active', '=', 'True'],    ['teacher_name', '=', teacherName]  ]; //通过手机号找到教练编号,再加查询条件  fieldNames = [    'name',    'teacher_name',    'teacher_full_name',    'Holiday_begin_date',    'Holiday_end_date',    'note'  ];  try {    var result = await xml_rpc.call(      XML_ROOT_OBJECT,      'execute',      [        DB,        uID,        PASS,        'nebula.teacher.holiday',        'search_read',        domain,        fieldNames,      ],    );    print(result);  } catch (e) {    print(e);  }}
注意HOST必须是ODOO服务器的真实IP地址,而不是127.0.0.1或者localhost之类的地址。

整个流程:登录->通过手机号获取教练编号->通过教练编号获取教练假期信息,我们也可以采用这种方式获取学员编号和相关信息。

在实际应用中,我们可以通过极光手机验证等方式先验证手机号是不是合法的,这样就可以知道真正的手机号码了,也有很多短信验证平台供使用,他们都有相关接入例子供参考。

先启动虚拟机,启动成功后,再鼠标右键run‘main.dart’,即可在左下角Run标签显示查询结果。

最新文章

随机文章