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, dass Sie etwa Folgendes tun sollen:

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.
  • www_redirect – Wenn auf True gesetzt, werden Requests an Nicht-www-Versionen der erlaubten Hosts zu deren www-GegenstĂŒcken umgeleitet. Der Defaultwert ist True.

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, compresslevel=5)


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

Die folgenden Argumente werden unterstĂŒtzt:

  • minimum_size – Responses, die kleiner als diese MindestgrĂ¶ĂŸe in Bytes sind, nicht per GZip komprimieren. Der Defaultwert ist 500.
  • compresslevel – Wird wĂ€hrend der GZip-Kompression verwendet. Es ist ein Ganzzahlwert zwischen 1 und 9. Der Defaultwert ist 9. Ein niedrigerer Wert resultiert in schnellerer Kompression, aber grĂ¶ĂŸeren DateigrĂ¶ĂŸen, wĂ€hrend ein höherer Wert langsamere Kompression, aber kleinere DateigrĂ¶ĂŸen zur Folge hat.

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.