3

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

これを実現するために、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 アドレスとリクエスト データがすべて混同して処理される場合があることです。つまり、リクエスト IP アドレスが実際のアドレスと一致しません。

_dispatch の最後の行に何か問題がありますか、それとも何か見落としがありますか?

ありがとう!

4

1 に答える 1

0

function(ip_addr ...)カスタムメソッドを呼び出すことによって発生した例外を再発生させる必要があります_dispatch。そうしないと、組み込みのエラー処理が短絡するリスクがあります。

これが私が意味することです...

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をサブクラス化するとどうなりますか?

于 2011-08-14T06:48:20.477 に答える