HTTPX:用 proxy 和 mounts 选择代理路由
使用 HTTPX 的 proxy 与传输挂载配置代理,分清端点协议、环境变量行为,以及连接和读取各自的超时限制。
一个端点负责客户端请求时,用 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) 覆盖连接超时,同时用默认值提供其他已配置的超时分量。读取、写入和等待连接池各有独立限制;十五秒不是整个操作的总耗时上限。连接池超时可能是其他工作占着可用连接。把它当成代理不可达的证据之前,先正确关闭客户端和流式响应。