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地址和请求的数据会搞混,也就是说,请求的IP地址和实际的地址不匹配。
是不是_dispatch的最后一行有问题,或者我们遗漏了什么?
谢谢!
1 个回答
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 会发生什么呢?