一个端点负责客户端请求时,用 proxy=。目标协议需要不同路由时,用 mounts=。下面的示例采用这两种 HTTPX 接口;还在使用旧版 proxies= API 的项目,需要与该版本相符的配置。

一个端点

import httpx

timeout = httpx.Timeout(15.0, connect=5.0)

with httpx.Client(
    proxy="http://127.0.0.1:8080",
    trust_env=False,
    timeout=timeout,
) as client:
    response = client.get("https://example.com/")
    response.raise_for_status()
    print(response.status_code)

把本地监听地址换成正在运行的 HTTP 代理;从HTTP 代理列表选出的候选,仍需针对你的目标测试。HTTPS 目标可以通过 CONNECT 使用这个 http:// 端点。若把端点协议改成 https://,请求的就是到代理本身的 TLS,这需要监听端和客户端都支持。

按目标协议分开路由

import httpx

mounts = {
    "http://": httpx.HTTPTransport(
        proxy="http://127.0.0.1:8080",
        trust_env=False,
    ),
    "https://": httpx.HTTPTransport(
        proxy="http://127.0.0.1:8081",
        trust_env=False,
    ),
}

with httpx.Client(
    mounts=mounts,
    trust_env=False,
    timeout=httpx.Timeout(15.0, connect=5.0),
) as client:
    response = client.get("https://example.com/")
    response.raise_for_status()
    print(response.status_code)

挂载键匹配的是目标 URL。这里 HTTP 目标选择 8080 端口,HTTPS 目标选择 8081。代理值描述的是监听端自己的协议,所以 HTTPS 挂载中出现 http:// 代理是正确的。换成自己的端点后,两种目标协议都要检查。

两种写法都在客户端上设置 trust_env=False;提供了 transport 时,也在 transport 上设置。否则 HTTPX 默认读取代理和证书环境变量。如果部署依赖这些变量,应保持自动发现开启,或明确配置所需路由和信任。私有信任使用当前 HTTPX 版本支持的 TLS 上下文与 CA 配置,并保持目标证书验证开启。HTTPS 代理的信任配置可以与目标信任分开。

httpx.Timeout(15.0, connect=5.0) 覆盖连接超时,同时用默认值提供其他已配置的超时分量。读取、写入和等待连接池各有独立限制;十五秒不是整个操作的总耗时上限。连接池超时可能是其他工作占着可用连接。把它当成代理不可达的证据之前,先正确关闭客户端和流式响应。

相关文章