使用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"
最新文章
- Clang: Undefined symbols, but it is there using nm.
- GROUP与HAVING的使用
- linux kernel 杂谈
- 使用ftp软件上传下载php文件时换行丢失bug
- 再详细的介绍一下Unity5的AssetBundle
- JQuery 选中Radio
- Java中List Set Map 是否有序等总结
- AIM Tech Round (Div. 2) A. Save Luke 水题
- ArcGIS Add-in开发(一)--获取选定要素的属性值
- Android studio 配置JNI环境
- Boost库学习之旅入门篇
- mysql的约束的讨论
- How feedback work for your improvement
- SQL注入(一) - 入门篇
- Redis中的数据对象
- .Net语言 APP开发平台——Smobiler学习日志:HoverBackColor属性的简单介绍
- java中函数的参数传递
- c#在Excel指定单元格中插入图片
- Alpha 冲刺十
- JSON.stringify() 格式化 输出log
热门文章
- JavaWeb中常见的乱码处理(亲测)
- 用Pandas获取商品期货价格并可视化
- [Codeforces #196] Tutorial
- 【BFS】Power Hungry Cows
- jquery 封装的ajax调用
- Mac电脑,Andorid studio 配置 Flutter
- Web安全测试指南--文件系统
- C# 获取文件版本
- __FILE__,__LINE__,FUNCTION__实现代码跟踪调试
- 解决myeclipse不编译的方法