Dans FastAPI, déclencher une RequestValidationError vous permet d'envoyer une réponse d'erreur personnalisée. Ceci est utile pour les points de terminaison qui nécessitent que des conditions spécifiques soient remplies, telles qu'un en-tête requis.
Cette option vous permet de remplacer le gestionnaire d'exceptions par défaut pour RequestValidationError, vous permettant de personnaliser la réponse d'erreur.
from fastapi import FastAPI, Request, Header, status from fastapi.exceptions import RequestValidationError from fastapi.responses import JSONResponse 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: 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}), )
La création d'une sous-application vous permet de créer une instance d'API distincte avec son propre gestionnaire d'exceptions. Cela vous permet de personnaliser la gestion des erreurs spécifiquement pour la sous-application.
from fastapi import FastAPI from fastapi.exceptions import RequestValidationError from fastapi.responses import JSONResponse app = FastAPI() subapi = FastAPI() @subapi.exception_handler(RequestValidationError) async def validation_exception_handler(exc: RequestValidationError): return JSONResponse(content={'401': 'Unauthorized'}, status_code=401) @subapi.get('/') async def subapi_route(some_custom_header: str = Header(...)): return {'some-custom-header': some_custom_header} app.mount('/sub', subapi)
Cette méthode vous permet de modifier le comportement d'une route spécifique en utilisant une classe APIRoute personnalisée.
from fastapi import FastAPI, APIRouter, Response, Request, Header, HTTPException from fastapi.exceptions import RequestValidationError 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: raise HTTPException(status_code=401, detail='401 Unauthorized') return custom_route_handler app = FastAPI() router = APIRouter(route_class=ValidationErrorHandlingRoute) @router.get('/custom') async def custom_route(some_custom_header: str = Header(...)): return {'some-custom-header': some_custom_header} app.include_router(router)
L'option 1 est simple à mettre en œuvre lorsque il vous suffit de personnaliser la réponse d'erreur pour des itinéraires spécifiques. L'option 2 convient lorsque vous souhaitez plus de contrôle sur le sous-domaine de votre API, comme l'application de différentes politiques de sécurité ou la gestion des exceptions. L'option 3 vous donne plus de contrôle sur les itinéraires individuels et est utile pour gérer des cas spécifiques au sein d'un itinéraire.
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!