Spaces:
Runtime error
Runtime error
| """ | |
| Custom middleware for the application | |
| """ | |
| from fastapi import Request | |
| from starlette.middleware.base import BaseHTTPMiddleware | |
| from starlette.responses import Response | |
| import logging | |
| import time | |
| from typing import Callable | |
| logger = logging.getLogger(__name__) | |
| class RequestLoggerMiddleware(BaseHTTPMiddleware): | |
| """Middleware for logging requests""" | |
| async def dispatch(self, request: Request, call_next: Callable) -> Response: | |
| start_time = time.time() | |
| # Get request details | |
| method = request.method | |
| url = str(request.url) | |
| try: | |
| # Process the request | |
| response = await call_next(request) | |
| # Calculate processing time | |
| process_time = time.time() - start_time | |
| # Log the request details | |
| logger.info( | |
| f"Request: {method} {url} - Status: {response.status_code} - " | |
| f"Processing Time: {process_time:.3f}s" | |
| ) | |
| return response | |
| except Exception as e: | |
| logger.error( | |
| f"Request failed: {method} {url} - Error: {str(e)}" | |
| ) | |
| raise | |
| class ErrorHandlerMiddleware(BaseHTTPMiddleware): | |
| """Middleware for handling errors""" | |
| async def dispatch(self, request: Request, call_next: Callable) -> Response: | |
| try: | |
| return await call_next(request) | |
| except Exception as e: | |
| # Log the error | |
| logger.error(f"Unhandled error: {str(e)}", exc_info=True) | |
| # Return error response | |
| return Response( | |
| content={"detail": "Internal server error"}, | |
| status_code=500 | |
| ) | |