- 从服务器拉取完整代码 - 按框架规范整理项目结构 - 配置 Drone CI 测试环境部署 - 包含后端(FastAPI)、前端(Vue3)、管理端 技术栈: Vue3 + TypeScript + FastAPI + MySQL
65 lines
1.7 KiB
Python
65 lines
1.7 KiB
Python
"""
|
||
中间件定义
|
||
"""
|
||
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
|