跳至內容

進階中介軟體

在主要教學中,您已了解如何將自訂中介軟體新增至您的應用程式。

接著,您也了解如何使用 CORSMiddleware 處理CORS

在本節中,我們將了解如何使用其他中介軟體。

新增 ASGI 中介軟體

由於 FastAPI 是基於 Starlette 並實作 ASGI 規範,因此您可以使用任何 ASGI 中介軟體。

中介軟體不一定要專為 FastAPI 或 Starlette 打造,只要它遵循 ASGI 規範即可。

一般來說,ASGI 中介軟體是類別,它們預期會接收 ASGI 應用程式作為第一個參數。

因此,在第三方 ASGI 中介軟體的文件中,它們可能會告訴您執行以下操作:

from unicorn import UnicornMiddleware

app = SomeASGIApp()

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

但 FastAPI(實際上是 Starlette)提供了一種更簡單的方法,可確保內部中介軟體正確處理伺服器錯誤和自訂例外處理程式。

為此,您可以使用 app.add_middleware()(如同 CORS 範例中所示)。

from fastapi import FastAPI
from unicorn import UnicornMiddleware

app = FastAPI()

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

app.add_middleware() 接收中介軟體類別作為第一個參數,以及任何要傳遞給中介軟體的其他參數。

整合式中介軟體

FastAPI 包含數個適用於常見使用案例的中介軟體,我們接下來將了解如何使用它們。

「技術細節」

對於接下來的範例,您也可以使用 from starlette.middleware.something import SomethingMiddleware

FastAPIfastapi.middleware 中提供數個中介軟體,僅為了方便開發人員使用。但大多數可用的中介軟體都直接來自 Starlette。

HTTPSRedirectMiddleware

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

任何傳入 httpws 的請求都將重新導向至安全協定。

from fastapi import FastAPI
from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware

app = FastAPI()

app.add_middleware(HTTPSRedirectMiddleware)


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

TrustedHostMiddleware

強制所有傳入請求都具有正確設定的 Host 標頭,以防止 HTTP Host 標頭攻擊。

from fastapi import FastAPI
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"}

支援以下參數

  • allowed_hosts - 允許作為主機名稱的網域名稱清單。支援萬用字元網域,例如 *.example.com,以比對子網域。要允許任何主機名稱,請使用 allowed_hosts=["*"] 或省略中介軟體。

如果傳入請求驗證失敗,則會傳送 400 回應。

GZipMiddleware

處理 Accept-Encoding 標頭中包含 "gzip" 的任何請求的 GZip 回應。

中介軟體將處理標準回應和串流回應。

from fastapi import FastAPI
from fastapi.middleware.gzip import GZipMiddleware

app = FastAPI()

app.add_middleware(GZipMiddleware, minimum_size=1000, compresslevel=5)


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

支援以下參數

  • minimum_size - 不要壓縮小於此最小大小(以位元組為單位)的回應。預設值為 500
  • compresslevel - 在 GZip 壓縮期間使用。它是一個介於 1 到 9 之間的整數。預設值為 9。較低的值會導致更快的壓縮速度,但檔案大小較大,而較高的值會導致較慢的壓縮速度,但檔案大小較小。

其他中介軟體

還有許多其他 ASGI 中介軟體。

例如

要查看其他可用的中介軟體,請查看Starlette 的中介軟體文件ASGI 精選清單