42 lines
1.2 KiB
Python
42 lines
1.2 KiB
Python
import re
|
|
from fastapi import Request
|
|
|
|
from models.blog import BlogVisit
|
|
from service import blog_service
|
|
from utils.blog_utils import get_user_agent_info, get_client_ip
|
|
from config.database import SessionLocal
|
|
from middleware.exceptions import AppException
|
|
|
|
|
|
async def blog_visit_middleware(request: Request, call_next):
|
|
# 检查路径是否匹配 /blog/content/{blog_id}
|
|
if match := re.match(r"^/blog/content/(\d+)$", request.url.path):
|
|
# 获取客户端信息
|
|
ip = get_client_ip(request)
|
|
user_agent = request.headers.get("User-Agent", "")
|
|
os, browser = get_user_agent_info(user_agent)
|
|
blog_id = int(match.group(1))
|
|
|
|
# 创建访问记录
|
|
blog_visit = BlogVisit(
|
|
ip=ip,
|
|
os=os,
|
|
browser=browser,
|
|
uri=request.url.path,
|
|
blog_id=blog_id
|
|
)
|
|
|
|
db = SessionLocal()
|
|
try:
|
|
blog_service.add_blog_visit(db, blog_visit)
|
|
db.commit()
|
|
except Exception as e:
|
|
db.rollback()
|
|
raise AppException(f"新增博客{blog_id}访问记录失败: {e}")
|
|
finally:
|
|
db.close()
|
|
|
|
# 继续处理请求
|
|
response = await call_next(request)
|
|
return response
|