ADD file via upload

YZY_branch
pf92rj7gs 4 months ago
parent 794562f4b5
commit 68aef79ca4

@ -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'<!!LOAD_TIMES!!>', str.encode(str(cast_time)[:5]))
except Exception as e:
# 记录处理过程中出现的任何错误
logger.error("Error OnlineMiddleware: %s" % e)
# 返回处理后的响应
return response
Loading…
Cancel
Save