【问题标题】:How to call decorated functions with XML RPC in Python?如何在 Python 中使用 XML RPC 调用修饰函数?
【发布时间】:2016-06-24 11:49:10
【问题描述】:

我有一个 XML RPC 服务器,我需要在该服务器上注册一些经过修饰的函数。每次我从客户端调用这些注册函数时,都会出现以下错误:

xmlrpclib.Fault: :method "test" is not supported'>

下面是代码:

服务器代码:

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 调用修饰函数的首选方法是什么。

【问题讨论】:

    标签: python xml-rpc xmlrpclib


    【解决方案1】:

    只需在注册时为函数添加一个名称。 server.register_function(test, "test") 效果很好。

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

    【讨论】:

    • 我修改了代码,现在我得到了一个不同的异常:File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xmlrpclib.py", line 793, in close raise Fault(**self._stack[0]) xmlrpclib.Fault: <Fault 1: "<type 'exceptions.TypeError'>:an integer is required"> @Shpionus:知道为什么会出现这个错误吗?
    猜你喜欢
    • 2013-09-17
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多