2026-03-18 17:18:23 +08:00
|
|
|
|
"""
|
|
|
|
|
|
HTTP 中间件:request_id 注入。
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
import uuid
|
|
|
|
|
|
|
2026-03-26 12:13:36 +08:00
|
|
|
|
from app.core.logging import logger
|
2026-03-18 17:18:23 +08:00
|
|
|
|
from starlette.middleware.base import BaseHTTPMiddleware
|
|
|
|
|
|
from starlette.requests import Request
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
with logger.contextualize(request_id=request_id):
|
|
|
|
|
|
response = await call_next(request)
|
|
|
|
|
|
|
|
|
|
|
|
response.headers["X-Request-ID"] = request_id
|
|
|
|
|
|
return response
|