我有一个可以(部分)在下面看到的自定义BaseHTTPServer.BaseHTTPRequestHandler
。它有一个特殊的方法,允许我分配一个回复生成器 - 一个获取一些数据的类(例如GET请求中某些参数的值)并生成一个XML回复,然后可以将其发送回客户端作为对请求的回复:
class CustomHandler(BaseHTTPServer.BaseHTTPRequestHandler):
# implementation
# ...
def set_reply_generator(self, generator):
self.generator = generator
def do_GET(self):
# process GET request
# ...
# and generate reply using generator
reply = self.generator.generate(...) # ... are some parameters that were in the GET request
# Encode
reply = reply.encode()
# set headers
self.__set_headers__(data_type='application/xml', data=reply)
# and send away
self.wfile.write(reply)
self.wfile.write('\n'.encode())
我将此处理程序传递给BaseHTTPServer.HTTPServer
:
def run(addr='127.0.0.1', port=8080):
server_addr = (addr, port)
server = BaseHTTPServer.HTTPServer(server_addr)
server_thread = threading.Thread(target=server.server_forever)
server_thread.start()
由于BaseHTTPServer.HTTPServer
的构造函数需要一个类而不是一个实例作为RequestHandlerClass
参数传递,我不能只创建一个我的处理程序的实例,调用set_reply_generator()
然后传递它上。即使有用,我仍然希望以后能够访问处理程序(例如,如果通过POST请求更改了GET请求的回复生成器),为此我需要知道如何检索服务器的实例正在使用。
我看了here,但我找不到它(可能错过了它)。我感觉它是私人的(即__...__
)。
到目前为止,我能够找到的是服务器使用的处理程序的类可以通过RequestHandlerClass
成员检索,但这与检索将要处理的处理程序的实例不同。请允许我拨打set_reply_generator(...)
。
此外,我试图创建一个自定义处理程序的实例,但后来我陷入鸡与蛋的问题:
这是间接证明HTTPServer
的构造函数是负责实例化处理程序的构造函数。