跳至內容

中間件

您可以在 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