如何在Python中向HTTP2 POST请求流式上传数据?
Python实现HTTP2 POST流式上传方案
对应你在JavaScript中用process.stdin.pipe(request)的场景,Python的httpx库可以通过以下几种方式实现流式上传:
直接传入类文件对象(最接近JS pipe用法)
sys.stdin本身是类文件对象,httpx支持直接将其作为请求体传入,会自动逐块读取并流式发送,无需一次性加载全部内容到内存:
import sys import httpx with httpx.Client(http2=True) as client: resp = client.post("https://目标服务器地址/upload", content=sys.stdin) print(resp.status_code)
自定义生成器分块传输
如果需要对上传数据做自定义处理(比如加密、格式转换),可以用生成器来逐块输出数据,httpx会流式发送每个生成的块:
import sys import httpx def stream_processed_input(): # 按4KB块读取标准输入,可根据需求调整块大小 while chunk := sys.stdin.read(4096): # 这里可以添加数据处理逻辑,比如chunk = process(chunk) yield chunk with httpx.Client(http2=True) as client: resp = client.post("https://目标服务器地址/upload", content=stream_processed_input()) print(resp.status_code)
异步场景下的流式上传
如果你的代码是异步架构,使用AsyncClient同样支持流式上传:
import sys import asyncio import httpx async def main(): async with httpx.AsyncClient(http2=True) as client: resp = await client.post("https://目标服务器地址/upload", content=sys.stdin) print(resp.status_code) asyncio.run(main())
注意事项
- 确保目标服务器支持HTTP2协议,并且能够处理流式上传的POST请求
- 类文件对象(如本地文件、
sys.stdin)会被httpx自动识别为流式数据源,无需额外处理 - 生成器方式适合需要自定义分块逻辑或数据预处理的场景
内容的提问来源于stack exchange,提问作者Tom Klino
相关产品推荐
相关产品推荐

