[Python] Python: Instance of BaseHTTPRequestHandler resets after GET Request

Discussão em 'Python' iniciado por Stack, Maio 3, 2025.

  1. Stack

    Stack Membro Participativo

    I have a Python BaseHTTPRequestHandler class that is called by an HTTPServer class. Basically the BaseHTTPRequestHandler just runs a basic algorithm and then responds to a Get request. The issue is that every time I do a Get request, I get the correct response but all the gathered data in BaseHTTPRequestHandler is reset as if each time a request is sent to the HTTPServer it creates a new instance of BaseHTTPRequestHandler. I can't find anything online that really explains what's going on behind the scenes. I've attached a simplified version of my code.

    Before anyone suggests creating a class or global variable, I am using a thread to create multiple instances of this class at once and doing so makes all the instances on each thread share and replace each other's data.

    CODE (indentation off when copy and pasted)

    BaseHTTPRequestHandler

    This simplified version just keeps track of the number of alerts that have happened. The problem is that the count always resets to 0 when I call a Get request as if the instance of the class is reset.

    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


    Main

    This class creates the HTTPServer and attaches the 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()

    Continue reading...

Compartilhe esta Página