Maison >développement back-end >Tutoriel Python >Comment puis-je personnaliser les réponses aux erreurs pour des itinéraires spécifiques dans FastAPI ?

Comment puis-je personnaliser les réponses aux erreurs pour des itinéraires spécifiques dans FastAPI ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-22 16:18:20257parcourir

How Can I Customize Error Responses for Specific Routes in FastAPI?

Personnalisation des réponses aux erreurs pour des itinéraires spécifiques dans FastAPI

Vue d'ensemble

FastAPI [1](#sources) fournit un Plateforme polyvalente pour personnalisation des réponses aux erreurs pour des itinéraires spécifiques. Cela permet aux développeurs de adapter la gestion des erreurs en fonction des exigences spécifiques de l'application. En remplaçant le gestionnaire d'exceptions par défaut ou en employant d'autres techniques telles que des sous-applications, on peut créer des réponses d'erreur personnalisées qui améliorent l'expérience utilisateur et fournissent des commentaires significatifs.

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

. 🎜>

Une approche consiste à remplacer le gestionnaire d'exceptions par défaut pour RequestValidationError. Cette exception est levée lorsqu'une requête contient des données non valides. En implémentant un gestionnaire personnalisé, vous pouvez rechercher des erreurs spécifiques liées à votre en-tête personnalisé requis et renvoyer une réponse d'erreur personnalisée.

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 whether the error relates to the `some_custom_header` parameter
        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}),
    )

Option 2 : sous -Applications

Une autre alternative consiste à créer des sous-applications et montage sur l'application principale. Cela permet une gestion personnalisée des erreurs spécifique aux routes au sein de la sous-application, sans affecter les autres routes dans l'application principale.

# main API
app = FastAPI()

# sub-application with custom error handling
subapi = FastAPI()
@subapi.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
    # Handle error specific to sub-application's routes
    return JSONResponse(content={'401': 'Unauthorized'}, status_code=401)

# mount sub-application
app.mount('/sub', subapi)

Option 3 : classe APIRoute personnalisée

Cette approche implique la création d'une classe APIRoute personnalisée qui gère la validation des requêtes dans un bloc try-sauf. Si une RequestValidationError est générée, une réponse d'erreur personnalisée peut être renvoyée.

from fastapi import FastAPI, APIRouter, APIRoute, Request, Header, HTTPException
from fastapi.responses import JSONResponse
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')

# create new router with custom error handling
router = APIRouter(route_class=ValidationErrorHandlingRoute)

# add custom error handling to router
@router.get('/custom')
async def custom_route(some_custom_header: str = Header(...)):
    return {'some-custom-header': some_custom_header}

# add router to app 
app.include_router(router)

Conclusion

En explorant ces techniques, les développeurs peuvent personnaliser les réponses d'erreur dans FastAPI pour répondre à des exigences spécifiques, offrant ainsi une plus grande expérience utilisateur personnalisée et capacités améliorées de gestion des erreurs.

Sources

  1. [FastAPI Documentation : Gestion des exceptions HTTP](https://fastapi.tiangolo.com/exception-handlers/)

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