odoo 中execute_kw的使用及json_rpc的使用

execute_kw

execute_kw 是 Odoo 中用于执行模型方法的通用方法。
在Odoo中,execute_kw是一个用于执行远程过程调用(RPC)的方法。它允许您通过指定模型、方法和参数来调用Odoo服务器上的函数。
它的定义如下:

execute_kw(db, uid, password, model, method, args=[], kwargs={})

参数说明:

db: 数据库名称
uid: 用户 ID
password: 用户密码
model: 模型名称
method: 方法名称
args: 位置参数(可选)
kwargs: 关键字参数(可选)

models.execute_kw(db, uid, password, 'res.partner', 'search', [[['is_company', '=', True], ['customer', '=', True]]])

注意,如果方法需要使用关键字参数,则需要在 kwargs 参数中传递一个字典,例如:

models.execute_kw(db, uid, password, 'res.partner', 'write', [[partner_id], {'name': 'New Name'}])

该示例调用了 res.partner 模型的 write 方法,用于更新指定合作伙伴的名称。其中:

partner_id 表示要更新的合作伙伴的 ID;
{‘name’: ‘New Name’} 表示关键字参数,用于设置要更新的字段及其值。
需要注意的是,如果执行的方法返回值,可以直接使用 execute_kw 方法获取,例如:

partner_id = models.execute_kw(db, uid, password, 'res.partner', 'create', [{'name': 'New Partner', 'customer': True}])

该示例调用了 res.partner 模型的 create 方法,用于创建一个新的客户合作伙伴。方法执行后会返回新创建的合作伙伴的 ID,可以直接使用以下方式获取

rpc

RPC(远程过程调用)是一种计算机通信协议,用于在不同的计算机或进程之间进行远程调用。它允许一个计算机程序通过网络请求另一个计算机上的服务,就像调用本地函数一样。下面是RPC的简介和使用方法:

基本原理:RPC的基本原理是客户端程序发起远程调用请求,服务器端程序接收请求并执行相应的操作,然后将结果返回给客户端。RPC隐藏了底层通信的复杂性,使得远程调用可以像本地调用一样简单。

协议选择:在使用RPC时,需要选择合适的通信协议。常见的RPC协议包括XML-RPC、JSON-RPC、gRPC等。这些协议有不同的特点和适用场景,例如XML-RPC支持XML作为数据格式,而gRPC使用了Protocol Buffers作为数据编码。根据你的需求选择合适的协议。

定义接口:在使用RPC之前,需要定义接口(API)来描述可用的远程过程或方法。接口定义可以使用IDL(接口定义语言)来描述,例如Protocol Buffers的IDL或者WSDL(Web Services Description Language)。接口描述定义了方法的参数和返回值类型等信息。

生成代理/存根:在客户端和服务器端分别生成代理和存根。代理是一个本地对象,用于封装远程调用的细节并提供类似本地函数调用的接口。存根是服务器端生成的代码,用于处理客户端请求并执行相应的操作。代理和存根的生成可以使用特定的工具和框架来完成。

远程调用:在客户端程序中,通过调用代理对象的方法来发起远程调用请求。代理对象负责将方法调用转换为适当的RPC消息,并将其发送到服务器。服务器接收到请求后,使用存根对象处理请求并执行相应的操作。最后,服务器将执行结果返回给客户端。

错误处理:在RPC中需要考虑错误处理机制。例如,当网络连接中断或服务器不可用时,客户端需要适当地处理这些错误情况。同时,服务器端也需要处理错误请求,并向客户端返回相应的错误信息。

安全性:对于涉及敏感信息或需要身份验证的RPC调用,安全性是一个重要考虑因素。可以使用加密协议(如HTTPS)或其他身份验证机制来保护RPC通信的安全性。

xml-rpc

XML-RPC(XML远程过程调用)是一种基于XML(可扩展标记语言)的远程调用协议,用于在不同的计算机之间进行跨网络的远程调用。它是一种简单和轻量级的协议,使用HTTP作为传输协议,并使用XML作为数据编码格式。

XML-RPC通过HTTP POST请求发送XML消息到远程服务器,并接收XML响应作为结果。它支持跨平台和跨语言的远程调用,使得不同系统之间的通信变得容易。

下面是XML-RPC的使用方法:

定义接口:首先,需要定义XML-RPC接口,描述可用的远程过程或方法。接口通常使用XML或类似的规范来定义参数和返回值的结构。

选择XML-RPC库:根据你使用的编程语言,选择适合的XML-RPC库或框架。许多编程语言都提供了XML-RPC的支持,例如Python的xmlrpclib库、Java的Apache XML-RPC、PHP的XML-RPC扩展等。

创建客户端:在客户端程序中,使用选定的XML-RPC库创建一个客户端对象。客户端对象负责将远程方法调用封装成XML-RPC消息,并发送到远程服务器。

远程调用:使用客户端对象调用远程方法。传递方法名和参数列表给客户端对象,它将负责将方法调用转换为XML-RPC消息,并将其发送给远程服务器。

创建服务器:在服务器端,使用选定的XML-RPC库创建一个服务器对象。服务器对象监听特定的HTTP请求,解析接收到的XML-RPC消息,并调用相应的本地方法来处理请求。

实现方法:在服务器上实现远程方法。根据接口定义,在服务器端代码中实现相应的方法逻辑,处理来自客户端的请求,并返回结果。

启动服务器:启动服务器并开始监听来自客户端的请求。服务器会将响应封装成XML-RPC消息发送回客户端。

错误处理:在XML-RPC中,需要考虑错误处理机制。例如,当远程调用失败或出现异常时,需要适当地处理错误情况,并向客户端返回错误信息。

XML-RPC是一种简单和通用的远程调用协议,易于实现和使用。然而,由于它使用XML作为数据编码格式,因此在性能方面可能没有其他二进制协议(如gRPC)效率高。根据你的需求和技术栈选择合适的协议和工具。

json_rpc

JSON-RPC(JSON远程过程调用)是一种基于JSON(JavaScript对象表示法)的远程调用协议,用于在不同的计算机之间进行跨网络的远程调用。它是一种轻量级的协议,使用HTTP或其他传输协议,并使用JSON作为数据编码格式。

JSON-RPC通过将方法调用封装为JSON对象,并通过HTTP请求发送到远程服务器来实现远程调用。服务器接收请求后,解析JSON对象,并执行相应的方法,然后将结果封装为JSON对象返回给客户端。

下面是JSON-RPC的使用方法:

定义接口:首先,需要定义JSON-RPC接口,描述可用的远程过程或方法。接口通常使用JSON对象来定义参数和返回值的结构。

选择JSON-RPC库:根据你使用的编程语言,选择适合的JSON-RPC库或框架。大多数编程语言都有支持JSON-RPC的库,例如Python的jsonrpc库、Java的JSON-RPC库、PHP的json-rpc等。

创建客户端:在客户端程序中,使用选定的JSON-RPC库创建一个客户端对象。客户端对象负责将远程方法调用封装成JSON-RPC请求,并发送到远程服务器。

远程调用:使用客户端对象调用远程方法。传递方法名和参数列表给客户端对象,它将负责将方法调用转换为JSON-RPC请求,并将其发送给远程服务器。

创建服务器:在服务器端,使用选定的JSON-RPC库创建一个服务器对象。服务器对象监听特定的HTTP请求,解析接收到的JSON-RPC请求,并调用相应的本地方法来处理请求。

实现方法:在服务器上实现远程方法。根据接口定义,在服务器端代码中实现相应的方法逻辑,处理来自客户端的请求,并返回结果。

启动服务器:启动服务器并开始监听来自客户端的请求。服务器会将响应封装成JSON-RPC响应发送回客户端。

错误处理:在JSON-RPC中,需要考虑错误处理机制。例如,当远程调用失败或出现异常时,需要适当地处理错误情况,并向客户端返回错误信息。

JSON-RPC是一种简单和通用的远程调用协议,易于实现和使用。它使用JSON作为数据编码格式,与大多数编程语言和平台兼容。与XML-RPC相比,JSON-RPC更加轻量级,因为JSON具有更紧凑的表示形式。根据你的需求和技术栈选择合适的协议和工具。

odoo中rpc的使用

import xmlrpc.client

# 连接到Odoo服务器
url = 'http://localhost:8069'
db = 'my_database'
username = 'admin'
password = 'admin'
common = xmlrpc.client.ServerProxy('{}/xmlrpc/2/common'.format(url))
uid = common.authenticate(db, username, password, {})

# 调用execute_kw方法
models = xmlrpc.client.ServerProxy('{}/xmlrpc/2/object'.format(url))
partner_count = models.execute_kw(db, uid, password, 'res.partner', 'search_count', [[('is_company', '=', True)]])
print("合作伙伴数量:", partner_count)

上述代码中,我们首先通过XML-RPC连接到Odoo服务器,并使用common.authenticate方法进行身份验证,获取用户ID uid。然后,我们使用models.execute_kw方法来调用res.partner模型的search_count方法,传递了一个条件参数来过滤合作伙伴,并将结果打印出来。

import odoorpc

url = 'localhost'
port = '8069'
db = 'my_database'
username = 'admin'
password = 'admin'
odoo = odoorpc.ODOO(url, port=port)
odoo.login(db, username, password)
order = odoo.env['res.partner']
doamin = [('is_company', '=', True)]  # doamin 写条件语句
data = order.search_read(doamin)  # 在这里我们就可以试试调用模型中自定义的方法
print(data)

在这里插入图片描述

返回结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值