Как получить доступ к RequestHandlerClass для HTTPServer в Python после его установки?

У меня есть пользовательский 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 отвечает за создание экземпляра обработчика.


person rbaleksandar    schedule 15.02.2018    source источник


Ответы (1)


Уже ответил здесь. Нет необходимости напрямую обращаться к обработчику, а лучше создать статический член класса, к которому можно получить доступ без экземпляра, но который все же будет обрабатываться, когда обработчик захочет его использовать.

person rbaleksandar    schedule 15.02.2018