1.?中間件基礎結構
from starlette.middleware.base import BaseHTTPMiddlewareclass RequestLoggerMiddleware(BaseHTTPMiddleware):async def dispatch(self, request: Request, call_next):# 1. 請求處理前邏輯# 2. 調用后續處理response = await call_next(request)# 3. 響應返回前邏輯return response
2. 簡單日志示例
from fastapi import Request
from starlette.middleware.base import BaseHTTPMiddleware
from logger import loggerclass RequestLoggerMiddleware(BaseHTTPMiddleware):async def dispatch(self, request: Request, call_next):if request.method == "GET":logger.info(f"Received request: {request.method} {request.url}")else:body = await request.body()logger.info(f"Received request: {request.method} {request.url}, Body: {body.decode()}")request._body = body # 關鍵:恢復bodyresponse = await call_next(request)logger.info(f"Sent response: {response.status_code}")return response
中間件的使用
from fastapi import FastAPI
from middleware.request_logger import RequestLoggerMiddleware
from middleware.token_auth import TokenAuthMiddlewareapp = FastAPI(title="My API")# 添加中間件的順序很重要!
# 先添加的中間件后執行(對于請求),先執行(對于響應)# 1. 首先添加請求日志中間件(最先記錄請求,最后記錄響應)
app.add_middleware(RequestLoggerMiddleware)# 2. 然后添加認證中間件
app.add_middleware(TokenAuthMiddleware)# 3. 可以添加其他中間件,如CORS、壓縮等
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(CORSMiddleware, allow_origins=["*"])@app.get("/")
async def root():return {"message": "Hello World"}