from __future__ import annotations import logging from time import monotonic from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint from starlette.requests import Request from starlette.responses import Response logger = logging.getLogger('web_api') class RequestLoggingMiddleware(BaseHTTPMiddleware): """Логирование входящих запросов в административный API.""" async def dispatch(self, request: Request, call_next: RequestResponseEndpoint) -> Response: start = monotonic() response: Response | None = None try: response = await call_next(request) return response finally: duration_ms = (monotonic() - start) * 1000 status = response.status_code if response else 'error' logger.debug( '%s %s -> %s (%.2f ms)', request.method, request.url.path, status, duration_ms, )