Zum Inhalt

Fortgeschrittene Middleware

Im Haupttutorial haben Sie gelesen, wie Sie Ihrer Anwendung benutzerdefinierte Middleware hinzufügen können.

Und dann auch, wie man CORS mittels der CORSMiddleware handhabt.

In diesem Abschnitt werden wir sehen, wie man andere Middlewares verwendet.

ASGI-Middleware hinzufügen

Da FastAPI auf Starlette basiert und die ASGI-Spezifikation implementiert, können Sie jede ASGI-Middleware verwenden.

Eine Middleware muss nicht speziell für FastAPI oder Starlette gemacht sein, um zu funktionieren, solange sie der ASGI-Spezifikation genügt.

Im Allgemeinen handelt es sich bei ASGI-Middleware um Klassen, die als erstes Argument eine ASGI-Anwendung erwarten.

In der Dokumentation für ASGI-Middlewares von Drittanbietern wird Ihnen wahrscheinlich gesagt, etwa Folgendes zu tun:

from unicorn import UnicornMiddleware

app = SomeASGIApp()

new_app = UnicornMiddleware(app, some_config="rainbow")

Aber FastAPI (eigentlich Starlette) bietet eine einfachere Möglichkeit, welche sicherstellt, dass die internen Middlewares zur Behandlung von Serverfehlern und benutzerdefinierten Exceptionhandlern ordnungsgemäß funktionieren.

Dazu verwenden Sie app.add_middleware() (wie schon im Beispiel für CORS gesehen).

from fastapi import FastAPI
from unicorn import UnicornMiddleware

app = FastAPI()

app.add_middleware(UnicornMiddleware, some_config="rainbow")

app.add_middleware() empfängt eine Middleware-Klasse als erstes Argument und dann alle weiteren Argumente, die an die Middleware übergeben werden sollen.

Integrierte Middleware

FastAPI enthält mehrere Middlewares für gängige Anwendungsfälle. Wir werden als Nächstes sehen, wie man sie verwendet.

Technische Details

Für die nächsten Beispiele könnten Sie auch from starlette.middleware.something import SomethingMiddleware verwenden.

FastAPI bietet mehrere Middlewares via fastapi.middleware an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Middlewares kommen aber direkt von Starlette.

HTTPSRedirectMiddleware

Erzwingt, dass alle eingehenden Requests entweder https oder wss sein müssen.

Alle eingehenden Requests an http oder ws werden stattdessen an das sichere Schema umgeleitet.

from fastapi import FastAPI
from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware

app = FastAPI()

app.add_middleware(HTTPSRedirectMiddleware)


@app.get("/")
async def main():
    return {"message": "Hello World"}

TrustedHostMiddleware

Erzwingt, dass alle eingehenden Requests einen korrekt gesetzten Host-Header haben, um sich vor HTTP-Host-Header-Angriffen zu schützen.

from fastapi import FastAPI
from fastapi.middleware.trustedhost import TrustedHostMiddleware

app = FastAPI()

app.add_middleware(
    TrustedHostMiddleware, allowed_hosts=["example.com", "*.example.com"]
)


@app.get("/")
async def main():
    return {"message": "Hello World"}

Die folgenden Argumente werden unterstützt:

  • allowed_hosts – Eine Liste von Domain-Namen, die als Hostnamen zulässig sein sollten. Wildcard-Domains wie *.example.com werden unterstützt, um Subdomains zu matchen. Um jeden Hostnamen zu erlauben, verwenden Sie entweder allowed_hosts=["*"] oder lassen Sie diese Middleware weg.

Wenn ein eingehender Request nicht korrekt validiert wird, wird eine „400“-Response gesendet.

GZipMiddleware

Verarbeitet GZip-Responses für alle Requests, die "gzip" im Accept-Encoding-Header enthalten.

Diese Middleware verarbeitet sowohl Standard- als auch Streaming-Responses.

from fastapi import FastAPI
from fastapi.middleware.gzip import GZipMiddleware

app = FastAPI()

app.add_middleware(GZipMiddleware, minimum_size=1000)


@app.get("/")
async def main():
    return "somebigcontent"

Die folgenden Argumente werden unterstützt:

  • minimum_size – Antworten, die kleiner als diese Mindestgröße in Bytes sind, nicht per GZip komprimieren. Der Defaultwert ist 500.

Andere Middlewares

Es gibt viele andere ASGI-Middlewares.

Zum Beispiel:

Um mehr über weitere verfügbare Middlewares herauszufinden, besuchen Sie Starlettes Middleware-Dokumentation und die ASGI Awesome List.