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