2011-06-28 17 views
3

私たちは、クライアント/サーバーXML-RPCベースのアプリケーションを開発しています。サーバー部分は、要求ごとに各クライアントのIPアドレスを知っている必要があります。SimpleXMLRPCServer要求ディスパッチングの問題

これを達成するために、SocketServer.ThreadingMixInをSimpleXMLRPCServerに組み込み、SimpleXMLRPCRequestHandlerをサブクラス化して_dispatchメソッドを再定義します。以下はコードです

class ThreadedXMLRPCServer(SocketServer.ThreadingMixIn, SimpleXMLRPCServer.SimpleXMLRPCServer): 
    pass 

class RequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHandler): 
    def _dispatch(self, method, params): 
     function = self.server.funcs[method] 

     def decor(function, ip_addr): 
      def new_function(*args): 
       try: 
        return function(ip_addr, *args) 
       except Exception, err: 
        log_msg('Exception ocurred in XMLRPC thread (%s)!' % err) 

      return new_function 

     return decor(function, self.client_address[0])(*params) 

問題は、IPアドレスを要求し、要求データがすべて混在して処理されることです。 e。リクエストのIPアドレスが実際のアドレスと一致しません。

_dispatchの最後の行に問題がありますか、何か不足していますか?

ありがとうございます!

+0

どのバージョンのPythonをターゲットにしていますか? – Marty

答えて

0

カスタム_dispatchメソッドでfunction(ip_addr ...)メソッドを呼び出すと例外が発生する可能性があります。そうしないと、組み込みのエラー処理が短絡する恐れがあります。それはあなたの問題に関連していた場合、私は驚かれることと思います、が、ここで

は... ...私は何を意味するか

class RequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHandler): 
    def _dispatch(self, method, params): 
     function = self.server.funcs[method] 

     def decor(function, ip_addr): 
      def new_function(*args): 
       try: 
        return function(ip_addr, *args) 
       except Exception, err: 
        log_msg('Exception ocurred in XMLRPC thread (%s)!' % err) 
        raise # <---- re-raise 

      return new_function 

です。私が知る限り、あなたが持っているものはうまくいくはずです。

代わりにForkingMixinをサブクラス化するとどうなりますか?

関連する問題