跳转至

以下内容基本上是 AI 生成的,我还没校对,可能质量不高

pyodide-httpx

Repo   ·   PyPI   ·   Source

Pyodide Httpx 是一个针对 Pyodide 环境的补丁库,它让 httpx 能够在浏览器中正常工作。

Features

  • Browser Fetch: 将 httpx 的底层传输层替换为浏览器的 fetch API。
  • 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 ChathamCloudflare 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 两个世界的差异。