Mit python socketserver wie kann ich das übergeben einer variable an den Konstruktor der handler-Klasse,
Ich möchte mein Datenbank-Verbindung zur EchoHandler Klasse, aber ich kann nicht herausfinden, wie zu tun, dass der oder Zugriff auf die EchoHandler Klasse überhaupt.
Klasse EchoHandler(SocketServer.StreamRequestHandler): def handle(self): print self.client_address, 'connected' wenn __name__ == '__main__': conn = MySQLdb.connect (host = "10.0.0.5", user = "user", passwd = "pass", db = "Datenbank") SocketServer.ForkingTCPServer.allow_reuse_address = 1 server = SocketServer.ForkingTCPServer(('10.0.0.6', 4242), EchoHandler) print "Server lauscht auf localhost:4242..." versuchen: server.allow_reuse_address server.serve_forever() except KeyboardInterrupt: print "\nbailing..."
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider, es ist wirklich nicht eine einfache Möglichkeit, access-Handler, die direkt von außerhalb der server.
Haben Sie zwei Optionen, um die Informationen zu den EchoHandler Instanzen:
server.conn = conn
vor dem Aufrufserver_forever()
) und dann Zugriff auf das Eigentum in EchoHandler.handler durchself.server.conn
.finish_request
und weisen Sie den Wert dort (Sie hätte, um es zu übergeben an den Konstruktor von EchoHandler und überschreiben EchoHandler.__init__). Das ist ein weit messier Lösung und es ist ziemlich viel verlangt, Sie um die Verbindung zu speichern auf dem server sowieso.Meine optionon Ihre beste Wette:
Mark T hat dazu Folgendes zu sagen, auf der python-list-Archiv
In der handler-Klasse, selbst.server bezieht sich auf das server-Objekt, Unterklasse so
die server und überschreiben init, um zusätzliche server-Parameter
und speichern Sie Sie als Instanz-Variablen.
super().__init__(...)
statt inMyServer.__init__
?Andere Art und Weise, dass ich glaube, mehr pythonic, ist Folgendes zu tun:
Können Sie jetzt geben Sie eine Instanz von Ihrem handler an den tcpserver gestartet:
Den tcpserver gestartet, normalerweise erzeugt eine neue Instanz von EchoHandler pro Anfrage, aber in diesem Fall, die __call__ Methode aufgerufen wird, anstatt den Konstruktor (es ist schon eine Instanz.)
In der nennen Methode, die ich explizit eine Kopie der aktuellen EchoHandler und übergeben es an den super-Konstruktor entspricht der ursprünglichen Logik der "one-handler-Instanz pro request".
Ist es Wert, einen Blick auf die SocketServer Moduls zu verstehen, was hier passiert: https://github.com/python/cpython/blob/2.7/Lib/SocketServer.py
Ich war derzeit der Lösung des gleichen Problems, aber ich verwendet etwas andere Lösung, ich finde es ist etwas schöner und mehr allgemein (inspiriert von @aramaki).
In der
EchoHandler
brauchen Sie nur zu überschreiben__init__
und geben Sie einen benutzerdefiniertenCreator
Methode.Dann können Sie einfach anrufen, die
Creator
- Methode, und übergeben Sie alles, was Sie brauchen.Hauptvorteil ist, dass auf diese Weise Sie sind nicht erstellen mehr Instanzen als nötig, und erweitern Sie die Klasse in überschaubare Weise - Sie brauchen nicht zu ändern, die
Creator
Methode immer wieder.