如何使用Python中的XML RPC调用修饰函数?

时间:2016-06-24 11:49:10

标签: python xml-rpc xmlrpclib

我有一个XML RPC服务器,我需要注册一些装饰的函数。每当我从客户端调用这些注册函数时,我都会收到以下错误:

xmlrpclib.Fault ::方法"测试"不支持'>

以下是代码:

服务器代码:

from SimpleXMLRPCServer import SimpleXMLRPCServer
import functools
import xmlrpclib

class Server(object):
  def __init__(self, hostport):
    self.server = SimpleXMLRPCServer(hostport)

  def serve_forever(self):
    self.server.serve_forever()

server = Server(('localhost', 8000))

def wrapper(func):
  def checker(*args):
    if isinstance(args[-1], dict):
      args = list(args)
      kwargs = args.pop(args[-1])
      return func(*args, **kwargs)
    else:
      return func(*args)
  return checker

@wrapper
def test(kwargs):
  print kwargs
  return 0

server.server.register_function(wrapper, "wrapper")
server.server.register_function(test, "test")
server.serve_forever()

客户代码:

import xmlrpclib
import functools
import inspect

_orig_Method = xmlrpclib._Method

class KeywordArgMethod(_orig_Method):
    def __call__(self, *args, **kwargs):
        args = list(args)
        if kwargs:
          args = list(args)
          args.append(kwargs)
        return _orig_Method.__call__(self, *args)

xmlrpclib._Method = KeywordArgMethod

class ServerProxy(object):
    def __init__(self, url):
        self._xmlrpc_server_proxy = xmlrpclib.ServerProxy(url)

#example usage
if __name__ == "__main__":
  server = ServerProxy('http://localhost:8000')
  server._xmlrpc_server_proxy.test(**{'arg1':1, 'arg2':2})

如何解决此错误。在python中使用XML RPC调用修饰函数的首选方法是什么。

1 个答案:

答案 0 :(得分:0)

只需在注册时添加功能名称即可。 server.register_function(test, "test")效果很好。

但你还需要修复装饰器本身: AttributeError: "'tuple' object has no attribute 'pop'"