Maison >développement back-end >Tutoriel Python >Comment personnaliser la réponse d'erreur de FastAPI pour des itinéraires spécifiques ?

Comment personnaliser la réponse d'erreur de FastAPI pour des itinéraires spécifiques ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-20 00:35:02725parcourir

How to Customize FastAPI's Error Response for Specific Routes?

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

Dans FastAPI, lors de la validation d'une requête, si un paramètre est manquant ou invalide, FastAPI déclenche une exception RequestValidationError. Par défaut, cette exception renvoie une réponse 422 Unprocessable Entity. Toutefois, vous souhaiterez peut-être personnaliser cette réponse pour des itinéraires spécifiques. Voici plusieurs approches pour y parvenir :

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

Remplacer le gestionnaire d'exceptions par défaut pour RequestValidationError et fournir une réponse personnalisée pour l'erreur souhaitée. itinéraires.

from fastapi import FastAPI, Request, status, HTTPException
from fastapi.responses import JSONResponse
from fastapi.encoders import jsonable_encoder
from fastapi.exceptions import RequestValidationError

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)

Option 2 : Utiliser une ou plusieurs sous-applications

Créez une sous-application et montez-la sur l'application principale pour le des itinéraires spécifiques. Remplacez le gestionnaire d'exceptions pour RequestValidationError dans la sous-application.

from fastapi import FastAPI, RequestValidationError, HTTPException
from fastapi.responses import JSONResponse

app = FastAPI()
subapi = FastAPI()

@subapi.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
    return 
JSONResponse(content={'401': 'Unauthorized'}, status_code=401)

app.mount('/sub', subapi)

Option 3 : Utilisez l'APIRouter personnalisé et l'APIRoute

Créez une sous-classe APIRoute personnalisée et remplacez-la. la méthode get_route_handler. Cela vous permet d'intercepter les requêtes et de gérer les exceptions RequestValidationError.

from fastapi import FastAPI
from fastapi.routing import APIRoute
from fastapi.responses import JSONResponse
from fastapi.exceptions import RequestValidationError
from fastapi.requests import Request

class ValidationErrorHandlingRoute(APIRoute):
    def get_route_handler(self):
        original_route_handler = super().get_route_handler()

        async def custom_route_handler(request: Request):
            try:
                return await original_route_handler(request)
            except RequestValidationError as e:
                return JSONResponse(content={'401': 'Unauthorized'}, status_code=401)

        return custom_route_handler

app = FastAPI()
router = APIRouter(route_class=ValidationErrorHandlingRoute)

@app.get('/')
async def main():
    return {'message': 'Hello from main API'}

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

app.include_router(router)

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