【问题标题】:SimpleXMLRPCServer request dispatching issueSimpleXMLRPCServer 请求调度问题
【发布时间】:2011-09-24 06:34:18
【问题描述】:

我们正在开发基于 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地址和请求数据都被混淆处理,即。 e.请求IP地址与真实地址不符。

_dispatch 的最后一行是否有问题或者我们遗漏了什么?

谢谢!

【问题讨论】:

  • 你的目标是哪个版本的python?

标签: python xml xml-rpc simplexmlrpcserver


【解决方案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

...不过,如果它与您的问题有关,我会感到惊讶。据我所知,你所拥有的应该可以正常工作。

出于好奇,如果您改为将 ForkingMixin 子类化会发生什么?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 2021-06-13
    • 2015-02-20
    • 2015-05-25
    • 1970-01-01
    相关资源
    最近更新 更多