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 Hintergrundaufgaben gab (später dokumentiert), werden sie nach allen Middlewares ausgeführt.

Erstellung einer Middleware

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. Verwenden Sie dafür das Präfix 'X-'.

Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen soll, müssen Sie sie zu Ihrer CORS-Konfigurationen (CORS (Cross-Origin Resource Sharing)) hinzufügen, indem Sie den Parameter expose_headers verwenden, der in der Starlette-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

Andere Middlewares

Sie können später mehr über andere Middlewares in Handbuch für fortgeschrittene Benutzer: Fortgeschrittene Middleware lesen.

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