Maison  >  Article  >  développement back-end  >  Comment personnaliser les réponses aux erreurs pour des routes FastAPI spécifiques ?

Comment personnaliser les réponses aux erreurs pour des routes FastAPI spécifiques ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-24 09:59:15286parcourir

How to Customize Error Responses for Specific FastAPI Routes?

Comment personnaliser la réponse d'erreur pour une route spécifique dans FastAPI

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.

Option 1 : Remplacer le gestionnaire d'exceptions par défaut

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}),
    )

Option 2 : Utiliser un sous-application

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)

Option 3 : Utiliser une classe APIRoute personnalisée

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)

Quelle option devez-vous utiliser ?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn