Jes*_*sse 18 python socketserver python-2.7
我想将我的数据库连接传递给EchoHandler类,但我根本无法弄清楚如何执行此操作或访问EchoHandler类.
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..."
cwa*_*ole 27
不幸的是,实际上没有一种简单的方法可以直接从服务器外部访问处理程序.
您有两种方法可以获取EchoHandler实例的信息:
server.conn = conn
在调用之前添加server_forever()
),然后通过EchoHandler.handler访问该属性self.server.conn
.finish_request
并在那里分配值(你必须将它传递给EchoHandler的构造函数并覆盖EchoHandler .__ init__).这是一个非常混乱的解决方案,它几乎要求您将连接存储在服务器上.我最喜欢的选择:
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
Run Code Online (Sandbox Code Playgroud)
Mark T在python列表存档上有以下说法
在处理程序类中,self.server引用服务器对象,因此将服务器子类化并覆盖init以获取任何其他服务器参数并将它们存储为实例变量.
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
Run Code Online (Sandbox Code Playgroud)