设置后如何在Python中访问HTTPServer的RequestHandlerClass?

时间:2018-02-15 13:06:44

标签: python httpserver basehttpserver

我有一个可以(部分)在下面看到的自定义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的构造函数是负责实例化处理程序的构造函数。

1 个答案:

答案 0 :(得分:0)

已经回答here。无需直接访问处理程序,而是创建一个静态类成员,该成员可以在没有实例的情况下进行访问,但在处理程序想要使用它时仍然可以进行处理。