我有一个类希望使用Python的SimpleXMLRPCServer作为远程服务进行暴露。服务器启动代码如下:
server = SimpleXMLRPCServer((serverSettings.LISTEN_IP,serverSettings.LISTEN_PORT))
service = Service()
server.register_instance(service)
server.serve_forever()
然后我有一个类名为ServiceRemote的类,代码如下:
def __init__(self,ip,port):
self.rpcClient = xmlrpclib.Server('http://%s:%d' %(ip,port))
def __getattr__(self, name):
# forward all calls to the rpc client
return getattr(self.rpcClient, name)
因此,ServiceRemote对象的所有调用都将转发到xmlrpclib.Server,然后再转发到远程服务器。问题出在服务中有一个接受命名变长参数的方法:
@useDb
def select(self, db, fields, **kwargs):
pass
@useDb 装饰器包装函数,在调用之前创建 db 并打开它,在返回结果之前关闭它。
当我调用此方法时,出现错误“call()收到意外的关键字参数'name'”。那么,是否可以远程调用带有变量命名参数的方法?还是我必须为我需要的每种方法变化创建一个覆盖。
谢谢反馈。我稍微改了一下代码,所以问题不再是问题了。如果我确实需要实现位置参数并支持远程调用,那么现在我知道了这个问题。我认为结合 Thomas 和 praptaks 的方法会很好。通过 xmlrpclient 将 kwargs 转换为位置参数并在服务器端对方法进行包装以解压缩位置参数。