FasrAPI 中間件

1 封裝中間件

有些時候,我們需要對許多URL采取共同的處理,比如判斷是否擁有權(quán)限訪問某頁面。這時,我們就可以通過中間件來實現(xià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

是的,這是一個經(jīng)典的例子,我甚至相信你們在其他的文章里面看過,這也是官網(wǎng)上對中間件的一個展示。

那么,根據(jù)這個栗子,我們就可以總結(jié)出中間件的步驟:

  1. 使用函數(shù)裝飾器注冊:
    @app.middleware("http") :

  2. 函數(shù)的參數(shù):

    1. request:Request,其中Request可以直接從fastapi中導入,不過,要知道它其實直接取自starlette

    2. call_next:這是一個函數(shù),它不一定是你注冊的那個響應(yīng)函數(shù),傳入request,返回response,你可以在中間件中對response進行一些處理后再繼續(xù)返回

  3. 返回response

2.使用已有的的中間件:

使用方式:app.add_middleware
參數(shù):
1. 第一個參數(shù)為要添加的中間件
2. 第二個參數(shù)為對中間件的配置

  1. CORS

例子:

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

origins = [
    "http://localhost.tiangolo.com",
    "https://localhost.tiangolo.com",
    "http://localhost",
    "http://localhost:8080",
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)


@app.get("/")
async def main():
    return {"message": "Hello World"}
  1. 添加ASGI中間件

由于FastAPI基于Starlette并實現(xiàn)了<abbr title="異步服務(wù)器網(wǎng)關(guān)接口" style="box-sizing: inherit; text-decoration: none; border-bottom: 0.05rem dotted var(--md-default-fg-color--light); cursor: help;">ASGI</abbr>規(guī)范,因此您可以使用任何ASGI中間件。

只要遵循ASGI規(guī)范,就不必為FastAPI或Starlette制作中間件。

通常,ASGI中間件是希望將ASGI應(yīng)用程序作為第一個參數(shù)的類。

因此,在第三方ASGI中間件的文檔中,它們可能會告訴您執(zhí)行以下操作:

from unicorn import UnicornMiddleware

app = SomeASGIApp()

new_app = UnicornMiddleware(app, some_config="rainbow")

但是FastAPI(實際上是Starlette)提供了一種更簡單的方法來確保內(nèi)部中間件處理服務(wù)器錯誤和自定義異常處理程序正常工作。

為此,您可以使用app.add_middleware()(如在CORS的示例中)。

from fastapi import FastAPI
from unicorn import UnicornMiddleware

app = FastAPI()

app.add_middleware(UnicornMiddleware, some_config="rainbow")

app.add_middleware() 接收中間件類作為第一個參數(shù),以及任何其他要傳遞給中間件的參數(shù)。

HTTPSRedirectMiddleware

強制所有傳入請求必須為httpswss

取而代之的是任何傳入的請求httpws將重定向到安全方案的請求。

from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware 
app = FastAPI()

app.add_middleware(HTTPSRedirectMiddleware) 

@app.get("/")
async def main():
    return {"message": "Hello World"}

TrustedHostMiddleware

強制所有傳入請求都具有正確設(shè)置的Host標頭,以防止受到HTTP Host Header攻擊。

from fastapi.middleware.trustedhost import TrustedHostMiddleware 
app = FastAPI()

app.add_middleware(
 TrustedHostMiddleware, allowed_hosts=["example.com", "*.example.com"] ) 

@app.get("/")
async def main():
    return {"message": "Hello World"}

支持以下參數(shù):

  • allowed_hosts-應(yīng)該允許作為主機名的域名列表。*.example.com支持使用通配符域(例如)來匹配子域,以允許任何主機名使用allowed_hosts=["*"]或省略中間件。

如果傳入請求未正確驗證,則將400發(fā)送響應(yīng)。

GZipMiddleware

手柄GZIP用于包括任何請求響應(yīng)"gzip"中的Accept-Encoding報頭。

中間件將處理標準響應(yīng)和流響應(yīng)。

from fastapi.middleware.gzip import GZipMiddleware 
app = FastAPI()

app.add_middleware(GZipMiddleware, minimum_size=1000) 

@app.get("/")
async def main():
    return "somebigcontent"

支持以下參數(shù):

  • minimum_size-不要GZip響應(yīng)小于此最小大小(以字節(jié)為單位)。默認為500。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容