Source code for python_template_server.middleware.request_logging_middleware

"""Middleware to log incoming requests and responses."""

import logging
from collections.abc import Awaitable, Callable

from fastapi import Request, Response
from starlette.middleware.base import BaseHTTPMiddleware
from starlette.types import ASGIApp


[docs] class RequestLoggingMiddleware(BaseHTTPMiddleware): """Middleware to log incoming requests and responses."""
[docs] def __init__(self, app: ASGIApp) -> None: """Initialize the RequestLoggingMiddleware.""" super().__init__(app) self.logger = logging.getLogger(__name__)
[docs] async def dispatch(self, request: Request, call_next: Callable[[Request], Awaitable[Response]]) -> Response: """Log request and response details.""" client_ip = request.client.host if request.client else "unknown" client_port = request.client.port if request.client else 0 self.logger.info( "Request: %s %s from %s:%d", request.method, request.url.path, client_ip, client_port, ) response = await call_next(request) self.logger.info( "Response: %s %s -> %d", request.method, request.url.path, response.status_code, ) return response