Heim > Backend-Entwicklung > Python-Tutorial > Wie kann ich Fehlerantworten für bestimmte Routen in FastAPI anpassen?

Wie kann ich Fehlerantworten für bestimmte Routen in FastAPI anpassen?

Barbara Streisand
Freigeben: 2024-11-20 00:54:03
Original
614 Leute haben es durchsucht

How to Customize Error Responses for Specific Routes in FastAPI?

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}
Nach dem Login kopieren

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}
Nach dem Login kopieren

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)
Nach dem Login kopieren

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)
Nach dem Login kopieren

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage