我有一个定制的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请求的应答生成器),为此,我需要知道如何检索服务器正在使用的实例。
我看过这里,但找不到它(可能错过了)。我有一种不好的预感,它是私人的(又名__...__)。
到目前为止,我所能发现的是,服务器使用的处理程序的类可以通过RequestHandlerClass成员检索,但是这与检索将允许我调用set_reply_generator(...)的处理程序实例不一样。
此外,我试图实际创建自定义处理程序的一个实例,但随后我遇到了一个鸡与蛋问题:
这是一个间接的证明,证明HTTPServer的构造函数是负责实例化处理程序的构造函数。
发布于 2018-02-15 14:06:08
已经回答了这里。不需要直接访问处理程序,而是创建一个静态类成员,它可以在没有实例的情况下进行访问,但在处理程序想要使用它时仍然需要处理。
https://stackoverflow.com/questions/48808048
复制相似问题