SimpleXMLRPCServer请求调度问题

时间:2011-06-28 12:12:30

标签: python xml xml-rpc simplexmlrpcserver

我们正在开发基于客户端 - 服务器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地址和请求数据都被混合处理,i。即请求IP地址与其真实地址不匹配。

_dispatch的最后一行是否有问题,或者我们错过了什么?

谢谢!

1 个答案:

答案 0 :(得分: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会发生什么?