Ich schreibe eine App mit Fastapi. Teile meines Codes erhöhen unterschiedliche Ausnahmen, die ich verarbeiten muss. Ich möchte, dass all diese Verarbeitung an einem einzelnen Ort durchgeführt wird (mit unterschiedlichen Blockaden, je nachdem, welche Ausnahme ausgelöst wurde). Ich habe versucht, dies zu tun, indem ich meiner Fastapi-App die folgende (vereinfachte) Middleware hinzufügte: < /p>
Code: Select all
from fastapi import APIRouter, FastAPI, Request, HTTPException, Response, status
from starlette.middleware.base import BaseHTTPMiddleware
from fastapi.responses import JSONResponse
class ExceptionHandlerMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next):
try:
return await call_next(request)
except HTTPException as e:
return JSONResponse(status_code=e.status_code, content={'message': e.detail})
except Exception as e:
return JSONResponse(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content={'message': str(e)})
# app creation and config go here....
app.add_middleware(ExceptionHandlerMiddleware)
Das
Problem ist, dass dies für einige spezifische Ausnahmen nicht funktioniert, die FASTAPI standardmäßig behandelt (z. B. wenn eine httpexception erhöht wird, wird niemals die Ausnahme des Blocks in meinem Middleware -Block erreicht, da es bereits standardmäßig verarbeitet wird, bevor die Mitte der Mitte des Dokumentationsverhaltens das Standard -Verhalten für die Ausgabe von Fastape -Verhaltensweisen, die das Verhalten von FastepiTs, ausgezeichnet haben. Dies ist langweilig und nicht skalierbar. Gibt es eine Möglichkeit, alle Ausnahmebehandlung global zu erzwingen, um meine Middleware zu durchlaufen? (Bonuspunkte, wenn jemand einen Weg kennt, dies ohne Dekorateure zu tun, wie eine Anforderung, die ich nicht verwendet habe.)