2016-06-24 17 views
0

私は装飾されているいくつかの機能を登録する必要があるXML RPCサーバーを持っています。私は、クライアントからこれらの登録関数を呼び出すたびに、私はエラーの下に取得する:Pythonで装飾された関数を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}) 

どのようにこのエラーを解決することができd。 PythonでXML RPCを使って装飾された関数を呼び出すための好ましい方法は何ですか?

答えて

0

関数の名前を登録するだけです。 server.register_function(test, "test")はうまく動作します。

しかし、あなたはまた、修正デコレータ自体が必要になります。 `ファイル「/System/Library/Frameworks/Python.framework/Versions/2.7/:私は、コードを修正して、今、私は別の例外を取得していますAttributeError: "'tuple' object has no attribute 'pop'"

+0

lib/python2.7/xmlrpclib.py "、line 793、close in raiseエラー(** self._stack [0]) xmlrpclib.Fault:<フォルト1:" :整数is required "> ' @Shpionus:このエラーがなぜ起こっているのでしょうか? – user2819403

+0

現在のバージョンのコードを表示できますか? –

関連する問題