FastAPI教程 中間件

2021-11-03 11:04 更新

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

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

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

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

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

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

創(chuàng)建中間件

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

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

  • request.
  • 一個(gè)函數(shù) call_next 它將接收 request 作為參數(shù).這個(gè)函數(shù)將 request 傳遞給相應(yīng)的 路徑操作.然后它將返回由相應(yīng)的路徑操作生成的 response.
  • 然后你可以在返回 response 前進(jìn)一步修改它.
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

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

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

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

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

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

在 response 的前和后

在任何路徑操作收到request前,可以添加要和請(qǐng)求一起運(yùn)行的代碼.

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

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

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é)中學(xué)習(xí)如何使用中間件處理 CORS .


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)