使用 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_POST
和 do_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}
....
我有一个这样的 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_POST
和 do_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}
....