最近在写Cooolis-ms的时候遇到一个坑,学艺不精靠搜索,最终解决了。
问题主要是不知道如何把ArgumentParser
处理的参数传递到继承了BaseRequestHandler
的class
中。
通常情况下,创建一个TCP的socketserver
代码如下:
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
while True:
try:
self.data = self.request.recv(1024).strip()
print("{} wrote:".format(self.client_address[0]))
print(self.data)
self.request.send(self.data.upper())
except ConnectionResetError as e:
print("err",e)
break
if __name__ == "__main__":
HOST,PORT = "localhost",9999
server = socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler)
server.serve_forever()
假若我想对MyTCPHandler
进行一些修饰,添加一些成员属性,那就需要覆盖__init__
函数,很多资料告诉我调用super
可以解决,但是BaseRequestHandler
是有参数的,这些参数必须由ThreadingTCPServer
进行传递。
因此,通过stackoverflow
上的一个大神解决了问题:
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
def __init__(self,request, client_address, server,name):
self.name = name
super().__init__(request, client_address, server)
def handle(self):
while True:
try:
self.data = self.request.recv(1024).strip()
print("{} wrote:".format(self.client_address[0]))
print(self.data)
self.request.send(self.data.upper())
except ConnectionResetError as e:
print("err",e)
break
@classmethod
def Creator(cls, *args, **kwargs):
def _HandlerCreator(request, client_address, server):
cls(request, client_address, server, *args, **kwargs)
return _HandlerCreator
if __name__ == "__main__":
HOST,PORT = "localhost",9999
name = 'handle'
server = socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler.Creator(name))
server.serve_forever()
调用Creator
就可以传递多余的参数。
这个问题解决了,代码都在Cooolis-ms里体现。