使用 httpx 在 FastAPI/Uvicorn 中发出下游 HTTP 请求
简介
使用FastAPI/Uvicorn 中的 API 端点依赖于外部 HTTP 请求,这一点至关重要确保并发的线程安全处理。本文探讨了使用 httpx 库解决此问题的推荐方法。
使用 httpx
在место请求中,httpx 提供了一个异步 API,它支持使用共享客户端。这通过重用连接和标头来提高性能。
在 FastAPI 中实现 httpx
要在 FastAPI 中使用 httpx,您可以利用其 AsyncClient:
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 状态的一部分,允许通过
异步示例
以下端点发出异步 HTTP 请求并将响应流式传输回客户端:
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))
更新的示例
随着启动和关闭事件的弃用,您可以现在使用生命周期处理程序:
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中文网其他相关文章!