首页 >后端开发 >Python教程 >在 FastAPI 中并发下行 HTTP 请求时,httpx 如何解决'h11._util.LocalProtocolError”?

在 FastAPI 中并发下行 HTTP 请求时,httpx 如何解决'h11._util.LocalProtocolError”?

Barbara Streisand
Barbara Streisand原创
2024-12-28 07:07:24162浏览

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

使用 Uvicorn/FastAPI 发出下游 HTTP 请求

问题:

发送多个并发时向 Uvicorn/FastAPI 上托管的 API 端点发出请求,错误为遇到:

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

解决方案:

要解决此问题并在 FastAPI 中有效处理下游 HTTP 请求,请考虑使用 httpx 而不是传统请求库。

为什么使用httpx?

  • 异步 API: httpx 提供异步 API,允许异步处理 HTTP(s) 请求。
  • 连接池化: httpx.AsyncClient() 实例对同一主机的多个请求重用 TCP 连接,从而优化
  • 流支持: httpx 为传入和传出请求提供内置流响应处理。

示例用法:

以下代码演示了在 FastAPI 中使用 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())

其他提示:

  • 使用生命周期处理程序来初始化和关闭httpx客户端。
  • 考虑使用流式传输响应以避免服务器端的内存消耗。
  • 使用limits关键字控制连接池大小httpx 客户端上的参数。

通过采用 httpx 并实施建议的最佳实践,您可以在 Uvicorn/FastAPI 应用程序中有效处理下游 HTTP 请求。

以上是在 FastAPI 中并发下行 HTTP 请求时,httpx 如何解决'h11._util.LocalProtocolError”?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn