2011-06-28 65 views
3

我們正在開發基於客戶端 - 服務器XML-RPC的應用程序。服務器部分應根據請求瞭解每個客戶端的IP地址。SimpleXMLRPCServer請求調度問題

爲了實現這一點,我們將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的最後一行有問題還是我們錯過了什麼?

謝謝!

+0

您定位的是哪個版本的python? – Marty

回答

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改爲子類會發生什麼?