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