首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python: GET请求后的BaseHTTPRequestHandler重置实例

Python: GET请求后的BaseHTTPRequestHandler重置实例
EN

Stack Overflow用户
提问于 2018-01-25 23:17:01
回答 1查看 779关注 0票数 2

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

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

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

BaseHTTPRequestHandler

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-25 23:42:46

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48453469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档