首页 > 后端开发 > Python教程 > 如何在 FastAPI/Uvicorn 中使用 httpx 高效处理下游 HTTP 请求?

如何在 FastAPI/Uvicorn 中使用 httpx 高效处理下游 HTTP 请求?

Linda Hamilton
发布: 2024-12-12 18:57:11
原创
646 人浏览过

How to Efficiently Handle Downstream HTTP Requests in FastAPI/Uvicorn Using httpx?

使用 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板