我对如何在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()
失败。这样做的正确方法是什么?我是否必须重新创建一个完整的TCPHandler over __init__
?
答案 0 :(得分:3)
相信你的直觉,正确的方法 确实是TCPServer的子类并覆盖__init__
方法,但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)
答案 1 :(得分:0)
正如我在post已经提出的那样,可以在不对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 的新实例,但在这种情况下,将调用 __ call __ 方法而不是构造函数(它已经是一个实例。 )
在调用方法中,我明确地制作了当前METCPHandler的副本,并将其传递给超级构造函数,以符合"每个请求的一个处理程序实例的原始逻辑"
值得一看的是SocketServer模块,以了解这里发生的事情:https://github.com/python/cpython/blob/2.7/Lib/SocketServer.py