使用python socketserver如何将变量传递给处理程序类的构造函数

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实例的信息:

  1. 将连接存储为服务器的属性(server.conn = conn在调用之前添加server_forever()),然后通过EchoHandler.handler访问该属性self.server.conn.
  2. 你可以覆盖服务器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)


dem*_*hog 9

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)

  • SocketServer模块中的类是"旧式"类.必须以这种方式调用超级构造函数.请参见:/sf/ask/806954501/ (2认同)