So passen Sie die Fehlerreaktion für eine bestimmte Route in FastAPI an
In FastAPI können Sie die Fehlerreaktion für eine bestimmte Route durch Überschreiben anpassen der Ausnahmehandler für RequestValidationError. Hier sind ein paar Optionen:
Option 1 (Einfach)
Wenn es Ihnen nichts ausmacht, wenn der Header in der OpenAPI-Dokumentation als optional angezeigt wird, können Sie den verwenden Folgender Code:
from fastapi import Header, HTTPException @app.post("/") def some_route(some_custom_header: Optional[str] = Header(None)): if not some_custom_header: raise HTTPException(status_code=401, detail="Unauthorized") return {"some-custom-header": some_custom_header}
Option 2 (Benutzerdefinierter Ausnahmehandler)
Damit der Header wie erforderlich in der OpenAPI-Dokumentation angezeigt wird, können Sie den Ausnahmehandler überschreiben:
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 for the specific Header in the errors 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}), ) @app.get("/") def some_route(some_custom_header: str = Header(...)): return {'some-custom-header': some_custom_header}
Option 3 (Unteranwendung)
Sie können eine Unteranwendung erstellen und diese in der Haupt-App bereitstellen. Dadurch können Sie den Ausnahmehandler nur für die in der Unteranwendung definierten Routen anpassen:
from fastapi import FastAPI, Request, Header from fastapi.exceptions import RequestValidationError from fastapi.responses import JSONResponse app = FastAPI() @app.get('/') async def main(): return {'message': 'Hello from main API'} subapi = FastAPI() @subapi.exception_handler(RequestValidationError) async def validation_exception_handler(request: Request, exc: RequestValidationError): # Custom exception handling return JSONResponse(content={'401': 'Unauthorized'}, status_code=401) @subapi.get('/') async def sub_api_route(some_custom_header: str = Header(...)): return {'some-custom-header': some_custom_header} app.mount('/sub', subapi)
Option 4 (Benutzerdefinierter APIRouter und Ausnahmebehandlung)
Sie können eine benutzerdefinierte APIRouter-Klasse verwenden und Ausnahmen innerhalb eines Try-Except-Blocks behandeln:
from fastapi import FastAPI, APIRouter, Response, Request, Header, HTTPException from fastapi.responses import JSONResponse from fastapi.exceptions import RequestValidationError from fastapi.routing import APIRoute from typing import Callable 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: # Custom exception handling raise HTTPException(status_code=401, detail='401 Unauthorized') 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)
Wählen Sie die Option, die Ihren Anforderungen am besten entspricht.
Das obige ist der detaillierte Inhalt vonWie kann ich Fehlerantworten für bestimmte Routen in FastAPI anpassen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!