進階中介軟體¶
在主要教學中,您已了解如何將自訂中介軟體新增至您的應用程式。
接著,您也了解如何使用 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
。
FastAPI 在 fastapi.middleware
中提供數個中介軟體,僅為了方便開發人員使用。但大多數可用的中介軟體都直接來自 Starlette。
HTTPSRedirectMiddleware
¶
強制所有傳入請求必須是 https
或 wss
。
任何傳入 http
或 ws
的請求都將重新導向至安全協定。
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 精選清單。