Python: экземпляр BaseHTTPRequestHandler сбрасывается после запроса GET

У меня есть python BaseHTTPRequestHandler класс, который вызывается HTTPServer учебный класс. В основном BaseHTTPRequestHandler просто запускает основной алгоритм, а затем отвечает на Get запрос. Проблема в том, что каждый раз, когда я делаю Get запрос, я получаю правильный ответ, но все собранные данные в BaseHTTPRequestHandler сбрасывается, как будто каждый раз, когда запрос отправляется HTTPServer это создает новый экземпляр BaseHTTPRequestHandler, Я не могу найти в Интернете ничего, что действительно объясняет, что происходит за кулисами. Я приложил упрощенную версию своего кода. Любая помощь или объяснение будет принята с благодарностью.

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

КОД (отступ при копировании и вставке)

BaseHTTPRequestHandler

Эта упрощенная версия просто отслеживает количество предупреждений, которые произошли. Проблема в том, что счетчик всегда сбрасывается в 0, когда я вызываю Get запрос, как будто экземпляр класса сбрасывается.

class SimulationServer(BaseHTTPRequestHandler):
def __init__(self, address, port, randomNumberMax, *args):
    self.IP_ADDRESS = address
    self.PORT = port
    self.RANDOM_NUMBER_MAX = randomNumberMax
    self.COUNT = 0
    BaseHTTPRequestHandler.__init__(self, *args)

def do_GET(self):
    if self.headers['Authorization'] == 'Basic ' + str(key):
        print("send response")
        self.do_HEAD()
        randomNumberMax = self.RANDOM_NUMBER_MAX
        response = ""

        if randint(0, randomNumberMax) == 0:
            self.generateAlert()

        base_path = urlparse(self.path).path
        print('base_path: ' + base_path)
        if base_path == '/count':
            response = self.getCount()

        self.wfile.write(bytes(response, 'utf-8'))

def getCount(self):
    count = self.COUNT
    jsonString = '{"_sig": "","count": ' + str(count) + '}'
    return jsonString

def generateAlert(self):
    newAlert = {}
    newAlert['siteId'] = "siteId"+ str(self.COUNT)
    newAlert['mesg'] = "Simulated Alert"
    newAlert['when'] = int(time.time())

    self.COUNT += 1

HTTPServer

class CustomHTTPServer(HTTPServer):
key = ''

def __init__(self, address, handlerClass=SimulationServer):
    super().__init__(address, handlerClass)

def set_auth(self, username, password):
    self.key = base64.b64encode(
        bytes('%s:%s' % (username, password), 'utf-8')).decode('ascii')

def get_auth_key(self):
    return self.key

Главный

Этот класс создает HTTPServer и придает handler

class RunSimulator(object):
def run(self, alertFrequency=50, port=9000):
    ipAddress="127.0.0.1"
    def handler(*args):
        SimulationServer(ipAddress, port, alertFrequency, *args)

    simulationServer = CustomHTTPServer((ipAddress, port), handler)
    simulationServer.set_auth('username', 'password')

    try:
        simulationServer.serve_forever()
    except KeyboardInterrupt:
        pass

    simulationServer.server_close()
    print(time.asctime(), "Server Stops - %s:%s" % (ipAddress, port))

if __name__ == "__main__":
    from sys import argv
    simu = RunSimulator()
    simu.run()

1 ответ

Решение

Таким образом, короткий ответ заключается в том, что он создает новый экземпляр каждый раз, когда отправляется запрос.

BaseHTTPServer.HTTPServer это подкласс SocketServer.TCPServer который сам является подклассом SocketServer.BaseServer, Каждый раз, когда поступает запрос, он обрабатывает запрос process_request а затем позвоните finish_request, finish_request создаст новый экземпляр того, чем является ваш обработчик запросов.

Другие вопросы по тегам