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 denrequest
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.
- Diese Funktion gibt den
- 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.