使用BaseHTTPRequestHandler时统计HTTP连接数

2024-09-28 01:32:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个像这样的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请求之间保持一个变量(例如对它们进行计数),请让我知道

谢谢你的问候和问候


Tags: fromimportselfdatadatetimeserverresponsedef
1条回答
网友
1楼 · 发布于 2024-09-28 01:32:32

您可以在类变量中计算do_POSTdo_GET请求数

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}
....

相关问题 更多 >

    热门问题