Zum Inhalt

Middleware

Sie können Middleware zu FastAPI-Anwendungen hinzufĂŒgen.

Eine „Middleware“ ist eine Funktion, die mit jedem Request arbeitet, bevor er von einer bestimmten Pfadoperation verarbeitet wird. Und auch mit jeder Response, bevor sie zurĂŒckgegeben wird.

  • Sie nimmt jeden Request entgegen, der an Ihre Anwendung gesendet wird.
  • Sie kann dann etwas mit diesem Request tun oder beliebigen Code ausfĂŒhren.
  • Dann gibt sie den Request zur Verarbeitung durch den Rest der Anwendung weiter (durch eine bestimmte Pfadoperation).
  • Sie nimmt dann die Response entgegen, die von der Anwendung generiert wurde (durch eine bestimmte Pfadoperation).
  • Sie kann etwas mit dieser Response tun oder beliebigen Code ausfĂŒhren.
  • Dann gibt sie die Response zurĂŒck.

Technische Details

Wenn Sie AbhĂ€ngigkeiten mit yield haben, wird der Exit-Code nach der Middleware ausgefĂŒhrt.

Wenn es Hintergrundtasks gab (dies wird spĂ€ter im Hintergrundtasks-Abschnitt behandelt), werden sie nach allen Middlewares ausgefĂŒhrt.

Eine Middleware erstellen

Um eine Middleware zu erstellen, verwenden Sie den Dekorator @app.middleware("http") ĂŒber einer Funktion.

Die Middleware-Funktion erhÀlt:

  • Den request.
  • Eine Funktion call_next, die den request als Parameter erhĂ€lt.
    • Diese Funktion gibt den request an die entsprechende Pfadoperation weiter.
    • Dann gibt es die von der entsprechenden Pfadoperation generierte response zurĂŒck.
  • Sie können die response dann weiter modifizieren, bevor Sie sie zurĂŒckgeben.
import time

from fastapi import FastAPI, Request

app = FastAPI()


@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
    start_time = time.perf_counter()
    response = await call_next(request)
    process_time = time.perf_counter() - start_time
    response.headers["X-Process-Time"] = str(process_time)
    return response

Tipp

Beachten Sie, dass benutzerdefinierte proprietĂ€re Header hinzugefĂŒgt werden können unter Verwendung des X--PrĂ€fixes.

Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen soll, mĂŒssen Sie sie zu Ihrer CORS-Konfiguration (CORS (Cross-Origin Resource Sharing)) hinzufĂŒgen, indem Sie den Parameter expose_headers verwenden, der in der Starlettes CORS-Dokumentation dokumentiert ist.

Technische Details

Sie könnten auch from starlette.requests import Request verwenden.

FastAPI bietet es als Komfort fĂŒr Sie, den Entwickler, an. Aber es stammt direkt von Starlette.

Vor und nach der response

Sie können Code hinzufĂŒgen, der mit dem request ausgefĂŒhrt wird, bevor dieser von einer beliebigen Pfadoperation empfangen wird.

Und auch nachdem die response generiert wurde, bevor sie zurĂŒckgegeben wird.

Sie könnten beispielsweise einen benutzerdefinierten Header X-Process-Time hinzufĂŒgen, der die Zeit in Sekunden enthĂ€lt, die benötigt wurde, um den Request zu verarbeiten und eine Response zu generieren:

import time

from fastapi import FastAPI, Request

app = FastAPI()


@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
    start_time = time.perf_counter()
    response = await call_next(request)
    process_time = time.perf_counter() - start_time
    response.headers["X-Process-Time"] = str(process_time)
    return response

Tipp

Hier verwenden wir time.perf_counter() anstelle von time.time(), da es fĂŒr diese AnwendungsfĂ€lle prĂ€ziser sein kann. đŸ€“

AusfĂŒhrungsreihenfolge bei mehreren Middlewares

Wenn Sie mehrere Middlewares hinzufĂŒgen, entweder mit dem @app.middleware() Dekorator oder der Methode app.add_middleware(), umschließt jede neue Middleware die Anwendung und bildet einen Stapel. Die zuletzt hinzugefĂŒgte Middleware ist die Ă€ußerste, und die erste ist die innerste.

Auf dem Requestpfad lĂ€uft die Ă€ußerste Middleware zuerst.

Auf dem Responsepfad lÀuft sie zuletzt.

Zum Beispiel:

app.add_middleware(MiddlewareA)
app.add_middleware(MiddlewareB)

Dies fĂŒhrt zu folgender AusfĂŒhrungsreihenfolge:

  • Request: MiddlewareB → MiddlewareA → Route

  • Response: Route → MiddlewareA → MiddlewareB

Dieses Stapelverhalten stellt sicher, dass Middlewares in einer vorhersehbaren und kontrollierbaren Reihenfolge ausgefĂŒhrt werden.

Andere Middlewares

Sie können spĂ€ter mehr ĂŒber andere Middlewares im Handbuch fĂŒr fortgeschrittene Benutzer: Fortgeschrittene Middleware lesen.

In der nÀchsten Sektion erfahren Sie, wie Sie CORS mit einer Middleware behandeln können.