在python中向TCPHandler发送变量

在python中向TCPHandler发送变量,python,tcp,socketserver,Python,Tcp,Socketserver,我不知道如何在python中使用SocketServer.TCPServer将变量发送到TCPHandler HOST, PORT = hosts[0], args.port server = SocketServer.TCPServer((HOST, PORT), METCPHandler) server.serve_forever() 这要求: class METCPHandler(SocketServer.BaseRequestHandler): def h

我不知道如何在python中使用SocketServer.TCPServer将变量发送到TCPHandler

HOST, PORT = hosts[0], args.port
server = SocketServer.TCPServer((HOST, PORT), METCPHandler)
server.serve_forever()
这要求:

class METCPHandler(SocketServer.BaseRequestHandler):           
    def handle(self):
        self.data = self.request.recv(1024).strip()
        print "{} wrote:".format(self.client_address[0])
        r = MExpressHandler(self.data, False)
但是我想把一个调试布尔值传递给MExpressHandler。。所以

HOST, PORT = hosts[0], args.port
server = SocketServer.TCPServer((HOST, PORT), METCPHandler(debug))
server.serve_forever()

失败了。正确的做法是什么?我是否必须在清除
\uuuu init\uuuu
的基础上重新创建一个完整的TCPHandler?

相信你的直觉,正确的方法确实是将TCPServer子类化并重写
\uu init\uuuuu
方法,但是Python使这非常容易

import SocketServer

class DebugTCPServer(SocketServer.TCPServer):
    def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True, debug=True):
        self.debug = debug
        SocketServer.TCPServer.__init__(self, server_address, RequestHandlerClass, bind_and_activate=True)

class DebugMETCPHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        # self.server is an instance of the DebugTCPServer
        DEBUG = self.server.debug
        self.data = self.request.recv(1024).strip()
        if DEBUG:
            print "{} wrote:".format(self.client_address[0])
        r = MExpressHandler(self.data, False)


server = DebugTCPServer((HOST, PORT), DebugMETCPHandler, debug=True)
或者,由于我们将
debug=True
指定为默认值:

server = DebugTCPServer((HOST, PORT), DebugMETCPHandler)
正如我在本文中已经提出的,不需要对TCPServer进行子分类就可以完成这项工作。事实上,它更简洁和通用

您可以通过以下方式向处理程序提供参数:

class METCPHandler(SocketServer.BaseRequestHandler):
  def __init__(self, debug):
    self.debug = debug

  def __call__(self, request, client_address, server):
    h = METCPHandler(self.debug)
    SocketServer.StreamRequestHandler.__init__(h, request, client_address, server)
现在,您可以将处理程序的实例提供给TCPServer:

SocketServer.TCPServer((HOST, PORT), METCPHandler(True))
TCPServer通常会为每个请求创建一个新的METCPHandler实例,但在这种情况下,将调用\uuuuuuuuuuuuuuuuuuuu方法,而不是构造函数(它已经是一个实例)

调用方法中,我显式地复制了当前METCPHandler,并将其传递给超级构造函数,以符合“每个请求一个处理程序实例”的原始逻辑


值得一看SocketServer模块,以了解这里发生了什么:

看看这个,这是一个重复,谢谢!我收到一个名称错误:未定义名称“TCPServer”。我必须以某种方式定义整个事情吗?很抱歉变暗。请确保“从SocketServer导入TCPServer”导入它,或像“SocketServer.TCPServer”一样引用它。问题位于
类DebuggetCpHandler(SocketServer.BaseRequestHandler):
行。那应该是不同的吗<代码>类DebugMETCPHandler(DebugTCPServer.BaseRequestHandler):我想知道,但我没有注意到TCPServer是一个旧式类,这意味着我们不能调用super,而是直接调用基类的init方法谢谢John_GG。仍然会导致相同的错误<代码>类DebugTCPServer(SocketServer.TCPServer):无论如何导入SocketServer(例如从SocketServer导入*)。(更准确地说,“NameError:未定义名称“SocketServer”)