geo/backend/app/middleware/request_id.py

30 lines
1.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Request ID 中间件:为每个请求生成并传播唯一标识符。"""
import uuid
import logging
from starlette.middleware.base import BaseHTTPMiddleware
from starlette.requests import Request
from starlette.responses import Response
logger = logging.getLogger("geo.request_id")
REQUEST_ID_HEADER = "X-Request-ID"
class RequestIdMiddleware(BaseHTTPMiddleware):
"""从请求头读取或自动生成 X-Request-ID注入 request.state 并写回响应头。
使用场景:
- 链路追踪:日志中携带 request_id 方便跨服务排查
- 客户端可主动传入 X-Request-ID实现端到端追踪
"""
async def dispatch(self, request: Request, call_next) -> Response:
request_id = request.headers.get(REQUEST_ID_HEADER) or str(uuid.uuid4())
# 注入到 request.state业务代码可通过 request.state.request_id 读取
request.state.request_id = request_id
response = await call_next(request)
response.headers[REQUEST_ID_HEADER] = request_id
return response