我有一个简单的xmlrpc服务器,定义为(server.py):
from SimpleXMLRPCServer import SimpleXMLRPCServer
def foo():
return "foo"
server = SimpleXMLRPCServer(("localhost", 1025))
server.register_introspection_functions()
server.register_function(foo, 'test.foo')
server.serve_forever()客户端(client.py)实现如下:
import xmlrpclib
class XMLRPC(object):
def __init__(self):
self.xmlrpc = xmlrpclib.ServerProxy("http://localhost:1025/RPC2")
def __getattr__(self, name):
attr = getattr(self.xmlrpc, name)
def wrapper(*args, **kwargs):
result = attr(*args, **kwargs)
return result
return wrapper
xmlrpc = XMLRPC()
print xmlrpc.test.foo()我想包装并执行在类xmlrpc中对XMLRPC服务器进行的每个调用。但是上面的工作示例给出了一个错误。
Traceback (most recent call last):
File "client.py", line 20, in <module>
xmlrpc.test.foo()
AttributeError: 'function' object has no attribute 'foo'如何使这段代码工作?
补充资料和制约因素:
wrapper包装functools.wraps(attr)。由于字符串attr没有属性__name__,所以我得到一个不同的错误server.py中定义的任何内容。return wrapper代替return attr不是一个解决方案--我需要在wrapper中执行实际的xmlrpc调用。发布于 2013-06-25 12:33:32
您需要返回一个可调用的对象。
XML代理返回一个可以调用但也可以遍历的对象的实例。因此,对于xmlrpc.test.foo(),您将xmlrpc.test包装在一个函数中;该函数对象没有foo属性,因为函数通常没有这样的属性。
相反,返回一个代理对象;__call__钩子使它成为一个可调用的对象,就像函数一样:
class WrapperProxy(object):
def __init__(self, wrapped):
self.wrapped = wrapped
def __getattr__(self, name):
attr = getattr(self.wrapped, name)
return type(self)(attr)
def __call__(self, *args, **kw):
return self.wrapped(*args, **kw)
class XMLRPC(object):
def __init__(self):
self.xmlrpc = xmlrpclib.ServerProxy("http://localhost:1025/RPC2")
def __getattr__(self, name):
attr = getattr(self.xmlrpc, name)
return WrapperProxy(attr)或者,合并成一个对象:
class XMLRPCWrapperProxy(object):
def __init__(self, wrapped=None):
if wrapped is None:
wrapped = xmlrpclib.ServerProxy("http://localhost:1025/RPC2")
self.wrapped = wrapped
def __getattr__(self, name):
attr = getattr(self.wrapped, name)
return type(self)(attr)
def __call__(self, *args, **kw):
return self.wrapped(*args, **kw)https://stackoverflow.com/questions/17297169
复制相似问题