Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

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..." 
like image 554
Jesse Avatar asked Jul 29 '11 15:07

Jesse


2 Answers

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 
like image 50
cwallenpoole Avatar answered Sep 22 '22 07:09

cwallenpoole


Mark T has the following to say on the python list archive

In the handler class, self.server refers to the server object, so subclass the server and override init to take any additional server parameters and store them as instance variables.

 import SocketServer  class MyServer(SocketServer.ThreadingTCPServer):      def __init__(self, server_address, RequestHandlerClass, arg1, arg2):         SocketServer.ThreadingTCPServer.__init__(self,                                                   server_address,                                                   RequestHandlerClass)         self.arg1 = arg1         self.arg2 = arg2   class MyHandler(SocketServer.StreamRequestHandler):      def handle(self):         print self.server.arg1         print self.server.arg2  
like image 22
demented hedgehog Avatar answered Sep 18 '22 07:09

demented hedgehog