feat: 初始化考培练系统项目
- 从服务器拉取完整代码 - 按框架规范整理项目结构 - 配置 Drone CI 测试环境部署 - 包含后端(FastAPI)、前端(Vue3)、管理端 技术栈: Vue3 + TypeScript + FastAPI + MySQL
This commit is contained in:
64
backend/app/core/middleware.py
Normal file
64
backend/app/core/middleware.py
Normal file
@@ -0,0 +1,64 @@
|
||||
"""
|
||||
中间件定义
|
||||
"""
|
||||
import time
|
||||
import uuid
|
||||
from typing import Callable
|
||||
|
||||
from fastapi import Request, Response
|
||||
from starlette.middleware.base import BaseHTTPMiddleware
|
||||
|
||||
from app.core.logger import logger
|
||||
|
||||
|
||||
class RequestIDMiddleware(BaseHTTPMiddleware):
|
||||
"""请求ID中间件"""
|
||||
|
||||
async def dispatch(self, request: Request, call_next: Callable) -> Response:
|
||||
# 生成请求ID
|
||||
request_id = str(uuid.uuid4())
|
||||
|
||||
# 将请求ID添加到request状态
|
||||
request.state.request_id = request_id
|
||||
|
||||
# 记录请求开始
|
||||
start_time = time.time()
|
||||
|
||||
# 处理请求
|
||||
response = await call_next(request)
|
||||
|
||||
# 计算处理时间
|
||||
process_time = time.time() - start_time
|
||||
|
||||
# 添加响应头
|
||||
response.headers["X-Request-ID"] = request_id
|
||||
response.headers["X-Process-Time"] = str(process_time)
|
||||
|
||||
# 记录请求日志
|
||||
logger.info(
|
||||
"HTTP请求",
|
||||
method=request.method,
|
||||
url=str(request.url),
|
||||
status_code=response.status_code,
|
||||
process_time=process_time,
|
||||
request_id=request_id,
|
||||
)
|
||||
|
||||
return response
|
||||
|
||||
|
||||
class GlobalContextMiddleware(BaseHTTPMiddleware):
|
||||
"""全局上下文中间件"""
|
||||
|
||||
async def dispatch(self, request: Request, call_next: Callable) -> Response:
|
||||
# 设置追踪ID(用于分布式追踪)
|
||||
trace_id = request.headers.get("X-Trace-ID", str(uuid.uuid4()))
|
||||
request.state.trace_id = trace_id
|
||||
|
||||
# 处理请求
|
||||
response = await call_next(request)
|
||||
|
||||
# 添加追踪ID到响应头
|
||||
response.headers["X-Trace-ID"] = trace_id
|
||||
|
||||
return response
|
||||
Reference in New Issue
Block a user