使用xml-rpc调试openerp模块中的函数

运行openerp模块中的函数 有很多方式, 可以在视图中加个按钮然后点击它, 也可以在集成开发环境中强制执行它。 不过, 用python写个小脚本,xml-rpc调用直接执行它, 无疑是最简便的方法了

一 调用方法

示例:

import xmlrpclib
from pprint import pprint

uid=1  #用户名admin所对应的id号
pwd="admin"   #admin对应的密码
dbname="demo"
tcp_port="8069"
sock=xmlrpclib.ServerProxy("http://127.0.0.1:%s/xmlrpc/object" % tcp_port)

model="hr.employee.category"  ##要运行哪个类中的函数?
method="read"      ##要运行的函数

##def read (self, cr, uid, ids, fields=None, context=None)  #函数签名
ids=[1,2,3]  ##参数一,
fields=[‘name‘,‘complete_name‘,‘parent_id‘, ‘child_ids‘]  ##参数二
result = sock.execute(dbname, uid, pwd,
                      model,method ,
                      ids, fields )
print "\n==== %s of %s ====" % (model, method)
pprint(result)

可以看到, 我们在sock.execute中使用的参数, 与函数签名中给出的参数不完全相同,其对应关系是:

---函数签名中最前面的三个参数为 self, cr, uid

--socke.exec中最前面的五个参数为 dbname, uid, pwd,model,method

其后的参数相同。

二 调用日志

在openerp 7.0中, 我们在浏览器中做的操作,都会转换成xml-rpc调用, 我们可以通过查看xml-rpc的调用日志, 来了解openerp是使用什么参数调用xml-rpc的。 我们可以在函数disptach下增加如下语句来生成日志

params = params[3:] ##加在这一行下面
from pprint import pformat  ##这一行最后加在文件顶部
if ( params[0][0:2] ==‘op.‘ or params[0][1:3] ==‘op.‘): #最关心的模块
    s=method+‘!‘+pformat(params[0])+pformat(params[1:],depth=9)
elif ( params[1] ==‘get_needaction_data‘):  #最不关心的调用
    s=method+‘!‘+pformat(params[0])+pformat(params[1:],depth=1)
else :  #其他模块
    s=method+‘!‘+pformat(params[0])+pformat(params[1:],depth=3

在7.0中,这段语句需要加在文件 service\web_services.py 的class objects_proxy中

在8.0中,这段语句需要加在文件 service\model.py中。 需要指出的是, 在默认情况下, oe8的浏览器操作已经不再使用xml-rpc了。

openerp提供了--log-request, 但是它记录的参数信息不够详细, 在oe7中, 生成的日志条数又太多, 因此我们不采用它。



三 调用以下划线开头的函数

出于安全的考虑, openerp不允许从模块外部调用下划线开头的函数。 在试验环境中, 这对于我们探索openerp的奥秘是个障碍, 我们注释如下这两行的源码就行了 (oe8在文件model.py中,oe7在文件osv.py中

if method.startswith(‘_‘):

#   raise except_orm(‘Access Denied‘, ‘Private methods (such as %s) cannot be called remotely.‘ % (method,))

运行这些以下划线开头的函数(以及browse函数),返回结果可能无法打包成xml格式, 这就会出现如下错误,

xmlrpclib.Fault: objects:

我们对python库文件xmlrpclib.py中的dump_struct函数稍加修改, 就可以运行除了broswe之外几乎所有的函数了

for k, v in value.items():
            write("\n")
            if type(k) is IntType:  ##添加此行和下一行
                k = "%d" % k        ##将diction的键值由数字转为字符
            if type(k) is not StringType:
                if unicode and type(k) is UnicodeType:
                    k = k.encode(self.encoding)
                else:
                    raise TypeError, "dictionary key must be string"
时间: 2024-10-21 20:15:45

使用xml-rpc调试openerp模块中的函数的相关文章

Python学习心得(三)函数之任意数量实参、任意数量关键字实参、导入模块中的函数

#!/usr/bin/python # -*- coding:utf-8 -*- ''' 1.传递任意数量的实参 Python允许函数传入任意数量的实参,例如: *messages形参名中的*表示让Python创建一个空的名称为messages的元组,接收传入的所有值 ''' def get_person_message(*messages): concat = '' for message in messages: concat += ' ' + message print "\nShow P

创建模块,并调用模块中的函数

模块就是一个包含python代码的文本文件,文件名以.py结尾,这是python扩展名: 1.创建一个模块nester.py,文件内容为: '''这是一个模块,可以打印列表,其中可能包含嵌套列表''' def print_list(the_list): """这个函数取一个位置参数the_list,他可以是任何列表,该列表中的每个数据都会递归地打印到屏幕上,各数据项各占一行""" for each_item in the_list: if isi

Python -- 使用模块中的函数

在确定自己不会导入多个同名函数(从不同模块导入)的情况下,你可能不希望在每次调用函数的时候,都要写上模块的名字.那么,可以使用import命令的另外一种形式: >>> from math import sqrt >>> sqrt(9) 3.0 在使用了“from 模块 import 函数”这种形式的import命令之后,就可以直接使用函数,而不需要模块名作为前缀. 事实上,可以使用变量来引用函数(或者Python之中大多数的对象).比如,通过 foo = math.sq

requests模块中request函数参数介绍

request.request: 参数: - method:  提交方式:'POST'.'GET'.'PUSH'等等 - url:     提交地址 - params: 在URL中传递的参数,主要用于GET方式提交 ,例如: requests.request( method='GET', url= 'http://www.baidu.com', params = {'k1':'v1','k2':'v2'} ) 提交后如下方式提交到后台: http://www.baidu.com?k1=v1&k2

python中thread模块中join函数

http://www.cnblogs.com/vingi/articles/2657790.html for i in range(10): t = ThreadTest(i) thread_arr.append(t) for i in range(10): thread_arr[i].start() for i in range(10): thread_arr[i].join() 简单说,阻塞进程指导线程执行完毕.通用的做法是我们启动一批线程,最后join这些线程结束. 总结:1 join方法

urllib模块中parse函数中的urlencode和quote_plus方法

本来只是向看一下quote_plus的作用,然后发现urlencode方法也是很方便的一个组合字符串的方法首先是介绍一下urlencode,他是将一些传入的元素使用&串联起来,效果如下: >>>params = { "appid": 1, "mch_id": 1, "body": 1, "out_trade_no": 1, "total_fee": 1, "spbill_

sklearn中xgboost模块中plot_importance函数(特征重要性)

# -*- coding: utf-8 -*- """ ############################################################################### # 作者:wanglei5205 # 邮箱:[email protected] # 代码:http://github.com/wanglei5205 # 博客:http://cnblogs.com/wanglei5205 # 目的:学习xgboost的plot_i

python 知识点:反射 之 getattr()实现以字符串形式导入模块和执行函数

# -*- coding: utf-8 -*- #知识点:反射 #通过字符串的形式去导入模块,这就是反射 #并以字符串的形式执行函数 #先看简单的小粒子 temp = 'mysql' #这个字符串是模块的名字(也就是mysql.py或sqlserver.py,后缀名不用写) func = 'count' #这个字符串是函数的名字(也就是mysql.py/sqlserver.py中的函数count) model = __import__(temp)    #以字符串的形式导入模块 #执行模块中的函

C++调用lua中的函数

测试lua脚本 一.lua中的全局函数 lua中的全局函数保存在lua的global表里 二.lua模块中的函数 lua中的模块被放在lua的global表里,模块中的函数以变量的形式保存在模块表里,比如test模块里的PrintMessage函数保存在test表里,key为PrintMessage,value是函数体.所以调用模块里的函数,首先lua_getglobal把模块压入栈,接着lua_gettable或lua_getfield把函数压入栈,最后lua_pcall调用函数.