From 68aef79ca45a19e1012c6bd13ebc8d5f45134dd1 Mon Sep 17 00:00:00 2001 From: pf92rj7gs <2945917937@qq.com> Date: Sat, 25 Oct 2025 19:13:14 +0800 Subject: [PATCH] ADD file via upload --- src/注释1.py | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/注释1.py diff --git a/src/注释1.py b/src/注释1.py new file mode 100644 index 0000000..6b97f70 --- /dev/null +++ b/src/注释1.py @@ -0,0 +1,75 @@ +import logging +import time + +from ipware import get_client_ip +from user_agents import parse + +from blog.documents import ELASTICSEARCH_ENABLED, ElaspedTimeDocumentManager + +# 获取当前模块的日志记录器 +logger = logging.getLogger(__name__) + + +class OnlineMiddleware(object): + """在线用户中间件,用于记录页面渲染时间和用户访问信息""" + + def __init__(self, get_response=None): + """初始化中间件 + Args: + get_response: Django 提供的获取响应的方法 + """ + self.get_response = get_response + super().__init__() + + def __call__(self, request): + ''' 主要处理逻辑:计算页面渲染时间 ''' + + # 记录请求开始时间 + start_time = time.time() + + # 调用后续中间件和视图处理,获取响应 + response = self.get_response(request) + + # 从请求头中获取用户代理信息 + http_user_agent = request.META.get('HTTP_USER_AGENT', '') + + # 获取客户端 IP 地址(第一个是真实IP,第二个可能是代理IP) + ip, _ = get_client_ip(request) + + # 解析用户代理字符串 + user_agent = parse(http_user_agent) + + # 如果不是流式响应(如文件下载),则处理常规响应 + if not response.streaming: + try: + # 计算渲染耗时(当前时间减去开始时间) + cast_time = time.time() - start_time + + # 如果 Elasticsearch 功能已启用 + if ELASTICSEARCH_ENABLED: + # 将秒转换为毫秒,并保留两位小数 + time_taken = round((cast_time) * 1000, 2) + url = request.path # 获取请求的URL路径 + + # 导入时间工具(延迟导入以避免循环依赖) + from django.utils import timezone + + # 创建 Elasticsearch 文档记录 + ElaspedTimeDocumentManager.create( + url=url, # 访问的URL + time_taken=time_taken, # 耗时(毫秒) + log_datetime=timezone.now(), # 记录时间 + useragent=user_agent, # 用户代理信息 + ip=ip) # 客户端IP地址 + + # 在响应内容中替换占位符为实际渲染时间 + # 将渲染时间截取前5位(避免过长)并转换为字节 + response.content = response.content.replace( + b'', str.encode(str(cast_time)[:5])) + + except Exception as e: + # 记录处理过程中出现的任何错误 + logger.error("Error OnlineMiddleware: %s" % e) + + # 返回处理后的响应 + return response \ No newline at end of file