使用 BaseHTTPRequestHandler 时计算 HTTP 连接数

Count HTTP connections when using BaseHTTPRequestHandler

我有一个这样的 HTTP 服务器

from http.server import BaseHTTPRequestHandler, HTTPServer
from datetime import datetime
import datetime as dt

numberOfTests = 1
timestamp = datetime.now()




class S(BaseHTTPRequestHandler):
    
    
    def formatResponse(self, vhod):
        global numberOfTests, timestamp
        timestamp = datetime.now()  
        if (numberOfTests == 1):
            print("Test "+str(numberOfTests)+" has started")
            numberOfTests =+ 1
            return          
        
        if (numberOfTests > 1):
            print("Test "+str(numberOfTests)+" has started")
            numberOfTests =+ 1
            

    def log_message(self, format, *args): #Silence internal log output
        return 

    def _set_response(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()

    def do_POST(self):
        content_length = int(self.headers['Content-Length']) # <--- Gets the size of data
        post_data = self.rfile.read(content_length) # <--- Gets the data itself

        self.formatResponse(post_data.decode('utf-8'))

        self._set_response()

def run(server_class=HTTPServer, handler_class=S, port=8080):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        pass
    httpd.server_close()

我希望每次建立连接时我都希望增加一个计数器

问题是我的计数器总是在建立新连接后重置(比如再次启动 BaseHTTPRequestHandler)所以我无法真正计数

最后我想测量 POST 请求之间的时间,如果时间是 x 做某事(但我需要先弄清楚如何在请求之间保留变量(就像想使用 time.time() 作为我的秒表,因为时间永远不会停止)

如果有人知道如何在 POST 个请求之间保留变量(例如计算它们),请告诉我

感谢您的回答和最诚挚的问候

您可以修饰 do_POSTdo_GET 在 class 变量中计算请求数。

from http.server import BaseHTTPRequestHandler, HTTPServer
from datetime import datetime
import datetime as dt
from functools import wraps


def count(fn):
    @wraps(fn)
    def wrapper(*args, **kw):
        cls = args[0]
        _http_method = fn.__name__[3:]  # Format method

        # Count via HTTP method
        if _http_method not in cls.counts:
            cls.counts[_http_method] = 0
        cls.counts[_http_method] += 1
        return fn(*args, **kw)

    return wrapper


class S(BaseHTTPRequestHandler):
    counts = {}

    def formatResponse(self, vhod):
        print(f"Counter: {self.counts}")

    def log_message(self, format, *args):  #Silence internal log output
        return

    def _set_response(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()

    @count
    def do_POST(self):
        content_length = int(
            self.headers['Content-Length']
        )  # <--- Gets the size of data
        post_data = self.rfile.read(content_length)  # <--- Gets the data itself

        self.formatResponse(post_data.decode('utf-8'))

        self._set_response()

    @count
    def do_GET(self):
        self.formatResponse('123')
        self._set_response()


def run(server_class=HTTPServer, handler_class=S, port=8080):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    httpd.serve_forever()
    httpd.server_close()


run()

输出:

Counter: {'GET': 1}
Counter: {'GET': 2}
Counter: {'GET': 3}
Counter: {'GET': 4}
....