以下内容基本上是 AI 生成的,我还没校对,可能质量不高
pyodide-httpx¶
Pyodide Httpx 是一个针对 Pyodide 环境的补丁库,它让 httpx 能够在浏览器中正常工作。
Features¶
- Browser Fetch: 将
httpx的底层传输层替换为浏览器的fetchAPI。 - Async Support: 支持异步 HTTP 请求,不阻塞浏览器主线程。
- Drop-in Replacement: 使用方式与标准
httpx几乎一致。
Implementation¶
核心是替换 AsyncClient._send_single_request 方法,利用 httpx 的 Transport Layer 解耦设计:
# src/pyodide_httpx/_async.py
async def _send_single_request(self: AsyncClient, request: Request) -> Response:
js_headers = js_Headers.new(request.headers.multi_items())
with acquire_buffer(request.content) as request_body:
res = await pyfetch(str(request.url), method=request.method,
headers=js_headers, body=request_body)
return Response(status_code=res.status, headers=Headers(res.headers),
stream=AsyncResponseStream(js_readable_stream_iter(res.body)))
Credits: 原始实现来自 Hood Chatham 的 Cloudflare Pyodide 项目,详见 Async Client libraries。
My Clever Bits (我的巧思)¶
我没有重写一个 HTTP 客户端,而是直接替换 AsyncClient._send_single_request 方法。
关键点是 Buffer 管理:使用 create_proxy() 将 Python bytes 包装为 JS 对象,通过 getBuffer() 获取底层 ArrayBuffer 实现零拷贝传输,然后用 contextmanager 确保 JS 对象正确释放。
Deep Insight (深入洞见)¶
这个项目解决了 Python 在浏览器中运行的一大痛点:Networking。
通过这个补丁,你可以在 Pyodide 中运行原本为服务器环境编写的爬虫或 API 客户端代码,而几乎不需要修改。这对于将 Python 数据科学栈或 AI Agent 迁移到纯前端环境至关重要。
它展示了在 WASM 时代,如何通过 Shim/Polyfill 的方式弥合 Native 和 Web 两个世界的差异。
Related Projects¶
- Cloudflare Pyodide: 原始实现来源
- Blog: Python Workers: 技术背景介绍
- WebAssembly JSPI: 同步请求支持的底层提案