Comment personnaliser la réponse d'erreur pour une route spécifique dans FastAPI
Dans FastAPI, vous pouvez personnaliser la réponse d'erreur pour une route spécifique en remplaçant le gestionnaire d'exceptions pour RequestValidationError. Voici quelques options :
Option 1 (Simple)
Si cela ne vous dérange pas que l'en-tête apparaisse comme facultatif dans la documentation OpenAPI, vous pouvez utiliser le code suivant :
from fastapi import Header, HTTPException @app.post("/") def some_route(some_custom_header: Optional[str] = Header(None)): if not some_custom_header: raise HTTPException(status_code=401, detail="Unauthorized") return {"some-custom-header": some_custom_header}
Option 2 (Exception personnalisée Handler)
Pour que l'en-tête apparaisse comme requis dans la documentation OpenAPI, vous pouvez remplacer le gestionnaire d'exceptions :
from fastapi import FastAPI, Request, Header, status from fastapi.exceptions import RequestValidationError from fastapi.responses import JSONResponse from fastapi.encoders import jsonable_encoder app = FastAPI() routes_with_custom_exception = ["/"] @app.exception_handler(RequestValidationError) async def validation_exception_handler(request: Request, exc: RequestValidationError): if request.url.path in routes_with_custom_exception: # Check for the specific Header in the errors for err in exc.errors(): if err['loc'][0] == 'header' and err['loc'][1] == 'some-custom-header': return JSONResponse(content={'401': 'Unauthorized'}, status_code=401) return JSONResponse( status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, content=jsonable_encoder({'detail': exc.errors(), 'body': exc.body}), ) @app.get("/") def some_route(some_custom_header: str = Header(...)): return {'some-custom-header': some_custom_header}
Option 3 (sous-application)
Vous pouvez créer une sous-application et la monter sur l'application principale. Cela vous permettra de personnaliser le gestionnaire d'exceptions uniquement pour les routes définies dans la sous-application :
from fastapi import FastAPI, Request, Header from fastapi.exceptions import RequestValidationError from fastapi.responses import JSONResponse app = FastAPI() @app.get('/') async def main(): return {'message': 'Hello from main API'} subapi = FastAPI() @subapi.exception_handler(RequestValidationError) async def validation_exception_handler(request: Request, exc: RequestValidationError): # Custom exception handling return JSONResponse(content={'401': 'Unauthorized'}, status_code=401) @subapi.get('/') async def sub_api_route(some_custom_header: str = Header(...)): return {'some-custom-header': some_custom_header} app.mount('/sub', subapi)
Option 4 (APIRouter personnalisé et gestion des exceptions)
Vous pouvez utiliser une classe APIRouter personnalisée et gérer les exceptions dans un bloc try-sauf :
from fastapi import FastAPI, APIRouter, Response, Request, Header, HTTPException from fastapi.responses import JSONResponse from fastapi.exceptions import RequestValidationError from fastapi.routing import APIRoute from typing import Callable class ValidationErrorHandlingRoute(APIRoute): def get_route_handler(self) -> Callable: original_route_handler = super().get_route_handler() async def custom_route_handler(request: Request) -> Response: try: return await original_route_handler(request) except RequestValidationError as e: # Custom exception handling raise HTTPException(status_code=401, detail='401 Unauthorized') return custom_route_handler app = FastAPI() router = APIRouter(route_class=ValidationErrorHandlingRoute) @app.get('/') async def main(): return {'message': 'Hello from main API'} @router.get('/custom') async def custom_route(some_custom_header: str = Header(...)): return {'some-custom-header': some_custom_header} app.include_router(router)
Choisissez l'option qui convient le mieux à votre exigences.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!