Проблема диспетчеризации запросов 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 или мы что-то упустили?

Спасибо!


person Sergey Simonenko    schedule 28.06.2011    source источник
comment
На какую версию Python вы ориентируетесь?   -  person Marty    schedule 14.08.2011


Ответы (1)


Вероятно, вам следует повторно вызвать любые возникшие исключения, вызвав 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?

person Marty    schedule 14.08.2011