""" HTTP 中间件:request_id 注入。 """ import uuid from starlette.middleware.base import BaseHTTPMiddleware from starlette.requests import Request from app.core.logging import logger from app.core.telemetry import current_trace_context class RequestIdMiddleware(BaseHTTPMiddleware): """Inject request_id into request.state and response headers, bind to loguru context.""" async def dispatch(self, request: Request, call_next): request_id = request.headers.get("X-Request-ID") or str(uuid.uuid4()) request.state.request_id = request_id bind = {"request_id": request_id, **current_trace_context()} with logger.contextualize(**bind): response = await call_next(request) response.headers["X-Request-ID"] = request_id return response