SimpleXMLRPCServerリクエストのディスパッチの問題

python simplexmlrpcserver xml xml-rpc
SimpleXMLRPCServerリクエストのディスパッチの問題

クライアントサーバーXML-RPCベースのアプリケーションを開発しています。 サーバー部分は、要求ごとに各クライアントのIPアドレスを知っている必要があります。

これを実現するために、SimpleXMLRPCServerとサブクラスSimpleXMLRPCRequestHandlerにSocketServer.ThreadingMixInを混合して、_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の最後の行に問題がありますか?

ありがとうございます。

  3  1


ベストアンサー

カスタムの _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
  1. ただし、それがあなたの問題に関連している場合、私は驚くでしょう。 なに
    私の知る限り、うまく動作するはずです。

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

0


タイトルとURLをコピーしました