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 denrequestals Parameter erhÀlt.- Diese Funktion gibt den
requestan die entsprechende Pfadoperation weiter. - Dann gibt es die von der entsprechenden Pfadoperation generierte
responsezurĂŒck.
- Diese Funktion gibt den
- Sie können die
responsedann 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.