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 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. 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.