中間件¶
您可以在 FastAPI 應用程式中加入中介軟體。
「中介軟體」是一個在任何特定路徑操作處理請求之前,以及在返回回應之前運作的函式。
- 它會接收每個傳送到您應用程式的請求。
- 然後它可以對該請求執行某些操作或執行任何必要的程式碼。
- 接著它會將請求傳遞給應用程式的其餘部分(由某些路徑操作)進行處理。
- 然後它會接收應用程式(由某些路徑操作)產生的回應。
- 它可以對該回應執行某些操作或執行任何必要的程式碼。
- 然後它會返回回應。
「技術細節」
如果您有使用 yield
的依賴項,則退出程式碼將會在中介軟體之後執行。
如果有任何背景任務(稍後說明),它們將會在所有中介軟體之後執行。
建立中介軟體¶
要建立中介軟體,您可以在函式上方使用裝飾器 @app.middleware("http")
。
中介軟體函式會接收:
request
(請求)。- 一個名為
call_next
的函式,它會接收request
作為參數。- 這個函式會將
request
傳遞給對應的路徑操作。 - 然後它會返回由對應的路徑操作產生的
response
(回應)。
- 這個函式會將
- 然後您可以在返回
response
之前進一步修改它。
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
提示
請記住,可以使用「X-」前綴新增自訂專有標頭。
但是,如果您有一些希望瀏覽器中的客戶端能夠看到的自訂標頭,則需要使用參數 expose_headers
將它們新增到您的 CORS 設定(CORS(跨來源資源共用)),這在Starlette 的 CORS 文件中有說明。
「技術細節」
您也可以使用 from starlette.requests import Request
。
FastAPI 提供它是為了方便您,也就是開發人員。但它直接來自 Starlette。
在 response
之前和之後¶
您可以在任何路徑操作接收 request
之前,新增要與 request
一起執行的程式碼。
也可以在產生 response
之後,返回它之前新增程式碼。
例如,您可以新增一個自訂標頭 X-Process-Time
,其中包含處理請求和產生回應所花費的時間(以秒為單位)。
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
提示
這裡我們使用time.perf_counter()
而不是 time.time()
,因為它在這些使用案例中可以更精確。🤓
其他中介軟體¶
您稍後可以在進階使用者指南:進階中介軟體中閱讀更多關於其他中介軟體的資訊。
您將在下一節中讀到如何使用中介軟體處理 CORS。