xmlrpc-服务端与客户端模块
XML-RPC 是一种远程过程调用方法,它使用通过 HTTP 传递的 XML 作为载体。 有了它,客户端可以在远程服务器上调用带参数的方法(服务器以 URI 命名)并获取结构化的数据。
xmlrpc.client-客户端
class xmlrpc.client.ServerProxy(uri, transport=None, encoding=None, verbose=False, allow_none=False, use_datetime=False, use_builtin_types=False, *, headers=(), context=None)
ServerProxy实例是管理与远程 XML-RPC 服务器通信的对象。 要求的第一个参数为 URI (统一资源定位符),通常就是服务器的 URL。 可选的第二个参数为传输工厂实例;在默认情况下对于 https: URL 是一个内部 SafeTransport
实例,在其他情况下则是一个内部 HTTP Transport
实例。 可选的第三个参数为编码格式,默认为 UTF-8。 可选的第四个参数为调试旗标。
from xmlrpc import client
server_url = 'http://localhost:9099'
db_name = 'testodoo'
username = 'admin'
password = '1'
common = client.ServerProxy('%s/xmlrpc/2/common' % server_url) #连接服务端
user_id = common.authenticate(db_name, username, password, {}) #获得登录用户ID
if user_id:
print("Success: User id is", user_id)
else:
print("Failed: wrong credentials")
返回成功!
查找
models = client.ServerProxy('%s/xmlrpc/2/object' % server_url)
user_id = common.authenticate(db_name, username, password, {})
search_domain = [['name', 'ilike', 'Room']] #设置过滤条件
rooms_ids = models.execute_kw(db_name, user_id, password,
'hostel.room', 'search',
[search_domain],
{'limit': 5})
print('Rooms ids found:', rooms_ids)
rooms_data = models.execute_kw(db_name, user_id, password,
'hostel.room', 'read',
[rooms_ids, ['name', 'room_no']])
print("Rooms data:", rooms_data)
search_domain = [['name', 'ilike', 'room']]
rooms_ids = models.execute_kw(db_name, user_id, password,
'hostel.room', 'search_read',
[search_domain, ['name', 'room_no']],
{'limit': 5})
print('Rooms data:', rooms_ids)
models.execute_kw("数据库名称","用户ID","用户密码","模型","操作方法(查询,创建等)",args=[], kwargs={}))
args: 位置参数(可选)
kwargs: 关键字参数(可选)
{'limit':5} 表示返回5条数据
方法:
1、search:查询返回ID
2、read:查询指定记录的字段信息
3、search_read:查询并读取信息
创建和写入
create_data = [
{'name': 'Room 1', 'room_no': '101'},
{'name': 'Room 3', 'room_no': '102'},
{'name': 'Room 5', 'room_no': '103'},
{'name': 'Room 7', 'room_no': '104'}
]
rooms_ids = models.execute_kw(db_name, user_id, password,
'hostel.room', 'create',
[create_data])
print("Rooms created:", rooms_ids)
room_to_write = rooms_ids[1]
write_data = {'name': 'Room 2'}
written = models.execute_kw(db_name, user_id, password,
'hostel.room', 'write',
[room_to_write, write_data])
print("Rooms written", written)
方法:
4、create:创建一条信息
5、write: 对信息进行修改
可以看到create创建后返回的是ID,write更新后返回的是布尔类型True。
这里直接创建后修改,所有房间名已经被修改成"Room 2"了
删除
方法:
6、unlink:根据ID删除对应信息
这里我们直接取上面创建的ID来删除对应的信息。
rooms_to_delete = rooms_ids[2:]
deleted = models.execute_kw(db_name, user_id, password,
'hostel.room', 'unlink',
[rooms_to_delete])
print('Rooms unlinked:', deleted)
为了方便演示,我这里采用上面创建方法重新创建了记录进行删除
删除后的返回值也是布尔类型,从第二个开始删除,所以还保留着前面两条记录。
函数方法
7、[函数方法]:调用函数
class HostelRoom(models.Model):
def make_available(self):
self.change_state('available')
return True
room_id = models.execute_kw(db_name, user_id, password,
'hostel.room', 'create',
[{
'name': 'New Room',
'room_no': '35',
'state': 'draft'
}])
models.execute_kw(db_name, user_id, password,
'hostel.room', 'make_available',
[[room_id]])
可以看到我们把draft通过函数改成了 available