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
Libérer: 2024-11-22 16:18:20
original
209 Les gens l'ont consulté

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}),
    )
Copier après la connexion

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)
Copier après la connexion

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)
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal