gpt4 book ai didi

Python:BaseHTTPRequestHandler 实例在 GET 请求后重置

转载 作者:行者123 更新时间:2023-12-01 02:14:30 26 4
gpt4 key购买 nike

我有一个由HTTPServer 类调用的python BaseHTTPRequestHandler 类。基本上,BaseHTTPRequestHandler 只是运行基本算法,然后响应 Get 请求。问题是,每次执行 Get 请求时,我都会得到正确的响应,但 BaseHTTPRequestHandler 中收集的所有数据都会重置,就像每次将请求发送到HTTPServer 它创建一个 BaseHTTPRequestHandler 的新实例。我在网上找不到任何真正解释幕后发生的事情的内容。我附上了我的代码的简化版本。任何帮助或解释将不胜感激。

在有人建议创建类或全局变量之前,我使用一个线程一次创建该类的多个实例,这样做使每个线程上的所有实例共享并替换彼此的数据。

代码(复制和粘贴时缩进)

BaseHTTPRequestHandler

这个简化版本仅跟踪已发生的警报数量。问题是,当我调用 Get 请求时,计数总是重置为 0,就像重置类的实例一样。

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

HTTP服务器

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 并附加处理程序

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()

最佳答案

所以简短的回答是,每次发送请求时它都会创建一个新实例。

BaseHTTPServer.HTTPServerSocketServer.TCPServer 的子类它本身是 SocketServer.BaseServer 的子类。每次收到请求时,它都会处理该请求 process_request然后调用finish_requestfinish_request将实例化您的请求处理程序的新实例。

关于Python:BaseHTTPRequestHandler 实例在 GET 请求后重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48453469/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com