使用httpx 在FastAPI/Uvicorn 中發出下游HTTP 請求
簡介
簡介使用API /Uvicorn 中的API 端點依賴外部HTTP請求,這一點至關重要確保並發的線程安全處理。本文探討了使用 httpx 函式庫解決此問題的建議方法。
使用 httpx
在место請求中,httpx 提供了一個非同步 API,它支援使用共享客戶端。這透過重複使用連接和標頭來提高效能。
在FastAPI 實現httpx
from fastapi import FastAPI from httpx import AsyncClient app = FastAPI() app.state.client = AsyncClient() @app.on_event("shutdown") async def shutdown_event(): await app.state.client.aclose()
要在FastAPI 中使用httpx,您可以利用其AsyncClient:
創建了一個共享客戶端作為FastAPI狀態的一部分,允許透過
非同步範例from fastapi import FastAPI, StreamingResponse, BackgroundTask @app.get("/") async def home(): client = app.state.client req = client.build_request("GET", "https://www.example.com/") r = await client.send(req, stream=True) return StreamingResponse(r.aiter_raw(), background=BackgroundTask(r.aclose))
以下端點發出非同步HTTP 請求並將回應串流傳輸回客戶端:
更新的範例from fastapi import FastAPI, Request, lifespan from starlette.background import BackgroundTask from httpx import AsyncClient, Request @lifespan.on_event("startup") async def startup_handler(app: FastAPI): app.state.client = AsyncClient() @lifespan.on_event("shutdown") async def shutdown_handler(): await app.state.client.aclose() @app.get("/") async def home(request: Request): client = request.state.client req = client.build_request("GET", "https://www.example.com") r = await client.send(req, stream=True) return StreamingResponse(r.aiter_raw(), background=BackgroundTask(r.aclose))
隨著啟動和關閉事件的棄用,您可以現在使用生命週期處理程序:
讀取回應內容def gen(): async for chunk in r.aiter_raw(): yield chunk await r.aclose() return StreamingResponse(gen())
如果您需要在將回應內容傳送到客戶端之前在伺服器端讀取回應內容,您可以使用一個產生器:
結論透過利用httpx 及其共用非同步客戶端,您可以在 FastAPI/Uvicorn 中有效處理下游 HTTP 請求,確保執行緒安全性和效能多執行緒環境下的最佳化。以上是如何在 FastAPI/Uvicorn 中使用 httpx 有效處理下游 HTTP 請求?的詳細內容。更多資訊請關注PHP中文網其他相關文章!