首頁 >後端開發 >Python教學 >在 FastAPI 中並發下行 HTTP 請求時,httpx 如何解決「h11._util.LocalProtocolError」?

在 FastAPI 中並發下行 HTTP 請求時,httpx 如何解決「h11._util.LocalProtocolError」?

Barbara Streisand
Barbara Streisand原創
2024-12-28 07:07:24122瀏覽

How Can httpx Solve `h11._util.LocalProtocolError` When Making Concurrent Downstream HTTP Requests in FastAPI?

使用Uvicorn/FastAPI 發出下游HTTP 請求

問題:

問題:
h11._util.LocalProtocolError: can't handle event type ConnectionClosed when role=SERVER and state=SEND_RESPONSE

問題:

發送多個>時向Uvicorn/FastAPI 上託管的API端點發出請求,錯誤為遇到:

解決方案:

    要解決此問題並在FastAPI 中有效處理下游HTTP 請求,請考慮使用
  • httpx 而不是傳統請求庫。
  • 為什麼使用httpx?
  • 非同步 API: httpx 提供非同步 API,允許非同步處理 HTTP(s) 請求。

連接池化: httpx.AsyncClient() 實例對同一主機的多個請求重用TCP 連接,從而優化

流支援:

httpx 為傳入和傳出請求提供內建串流響應處理。
from fastapi import FastAPI, StreamingResponse
from httpx import AsyncClient

app = FastAPI()

@app.on_event("startup")
async def startup_event():
    app.state.client = AsyncClient()

@app.on_event("shutdown")
async def shutdown_event():
    await app.state.client.aclose()

@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())

範例用法:

  • 以下程式碼示範了在 FastAPI 中使用httpx端點:
  • 其他提示:

使用生命週期處理程序初始化並關閉httpx客戶端。 考慮使用串流回應以避免伺服器端的記憶體消耗。 使用limits關鍵字控制連線池大小httpx 用戶端上的參數。 透過採用 httpx 並實作建議的最佳實踐,您可以在 Uvicorn/FastAPI 應用程式中有效處理下游 HTTP 請求。

以上是在 FastAPI 中並發下行 HTTP 請求時,httpx 如何解決「h11._util.LocalProtocolError」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn