pythonpython-2.7socketserver

With python socketserver how can I pass a variable to the constructor of the handler class


I would like to pass my database connection to the EchoHandler class, however I can't figure out how to do that or access the EchoHandler class at all.


class EchoHandler(SocketServer.StreamRequestHandler):
    def handle(self):
        print self.client_address, 'connected'

if __name__ == '__main__':
    conn = MySQLdb.connect (host = "10.0.0.5", user = "user", passwd = "pass", db = "database")

    SocketServer.ForkingTCPServer.allow_reuse_address = 1

    server = SocketServer.ForkingTCPServer(('10.0.0.6', 4242), EchoHandler)

    print "Server listening on localhost:4242..."
    try:
        server.allow_reuse_address
        server.serve_forever()
    except KeyboardInterrupt:
        print "\nbailing..."

Solution

  • Unfortunately, there really isn't an easy way to access the handlers directly from outside the server.

    You have two options to get the information to the EchoHandler instances:

    1. Store the connection as a property of the server (add server.conn = conn before calling server_forever()) and then access that property in EchoHandler.handler through self.server.conn.
    2. You can overwrite the server's finish_request and assign the value there (you would have to pass it to the constructor of EchoHandler and overwrite EchoHandler.__init__). That is a far messier solution and it pretty much requires you to store the connection on the server anyway.

    My optionon of your best bet:

    class EchoHandler(SocketServer.StreamRequestHandler):
        def handle(self):
            # I have no idea why you would print this but this is an example
            print( self.server.conn );
            print self.client_address, 'connected'
    
    if __name__ == '__main__':
        SocketServer.ForkingTCPServer.allow_reuse_address = 1
    
        server = SocketServer.ForkingTCPServer(('10.0.0.6', 4242), EchoHandler)
        server.conn = MySQLdb.connect (host = "10.0.0.5", 
                         user = "user", passwd = "pass", db = "database")
        # continue as normal