"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > 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 ?

Publié le 2024-12-21
Parcourir:206

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 une 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 vous n'avez besoin que 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.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3