FastAPI教程 中間件

2021-11-03 11:04 更新

你可以向 FastAPI 應(yīng)用添加中間件.

"中間件"是一個函數(shù),它在每個請求被特定的路徑操作處理之前,以及在每個響應(yīng)返回之前工作.

  • 它接收你的應(yīng)用程序的每一個請求.
  • 然后它可以對這個請求做一些事情或者執(zhí)行任何需要的代碼.
  • 然后它將請求傳遞給應(yīng)用程序的其他部分 (通過某種路徑操作).
  • 然后它獲取應(yīng)用程序生產(chǎn)的響應(yīng) (通過某種路徑操作).
  • 它可以對該響應(yīng)做些什么或者執(zhí)行任何需要的代碼.
  • 然后它返回這個 響應(yīng).

技術(shù)細節(jié)

如果你使用了 yield 關(guān)鍵字依賴, 依賴中的退出代碼將在執(zhí)行中間件后執(zhí)行.

如果有任何后臺任務(wù)(稍后記錄), 它們將在執(zhí)行中間件后運行.

創(chuàng)建中間件

要創(chuàng)建中間件你可以在函數(shù)的頂部使用裝飾器 @app.middleware("http").

中間件參數(shù)接收如下參數(shù):

  • request.
  • 一個函數(shù) call_next 它將接收 request 作為參數(shù).這個函數(shù)將 request 傳遞給相應(yīng)的 路徑操作.然后它將返回由相應(yīng)的路徑操作生成的 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.time()
    response = await call_next(request)
    process_time = time.time() - start_time
    response.headers["X-Process-Time"] = str(process_time)
    return response

Tip

請記住可以 用'X-' 前綴添加專有自定義請求頭.

但是如果你想讓瀏覽器中的客戶端看到你的自定義請求頭, 你需要把它們加到 CORS 配置 (CORS (Cross-Origin Resource Sharing)) 的 expose_headers 參數(shù)中,在 Starlette's CORS docs文檔中.

技術(shù)細節(jié)

你也可以使用 from starlette.requests import Request.

FastAPI 為了開發(fā)者方便提供了該對象. 但其實它直接來自于 Starlette.

在 response 的前和后

在任何路徑操作收到request前,可以添加要和請求一起運行的代碼.

也可以在響應(yīng)生成但是返回之前添加代碼.

例如你可以添加自定義請求頭 X-Process-Time 包含以秒為單位的接收請求和生成響應(yīng)的時間:

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.time()
    response = await call_next(request)
    process_time = time.time() - start_time
    response.headers["X-Process-Time"] = str(process_time)
    return response

其他中間件

你可以稍后在 Advanced User Guide: Advanced Middleware閱讀更多關(guān)于中間件的教程.

你將在下一節(jié)中學習如何使用中間件處理 CORS .


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號