Python Requests 的 Session 代理与环境覆盖
理清 session.proxies、环境变量、单次请求覆盖与 trust_env 的相互作用,让 Python Requests 的路由可预测。
如果 session.proxies 指向一个端点,脚本却用了 shell 的代理,重新赋值同一个字典并不能解决冲突。Requests 合并设置时,环境代理可能覆盖 Session 默认值。应先决定 Session 是否继续从环境发现配置。
保留环境发现,在请求中指定路由
按 Requests 的建议,为单次调用传入明确值,以避免这种 Session 与环境的冲突:
proxies = {
"http": "http://127.0.0.1:8080",
"https": "http://127.0.0.1:8080",
}
with requests.Session() as session:
response = session.get(
"https://example.com/",
proxies=proxies,
timeout=(5, 15),
)
response.raise_for_status()
将本地监听地址换成自己的。如果在比较公共 HTTP 端点,可从HTTP 代理列表选择候选,同时固定 Session 策略。这控制的是所提供映射中的条目;应用使用的其他协议方案或主机也需要有意识地选择配置。服务、IDE、容器或 CI 执行器继承的环境可能与终端不同。
让 Session 自主管理设置
如果应用不应从环境发现代理,请在首次请求之前设置此策略:
with requests.Session() as session:
session.trust_env = False
session.proxies = {
"http": "http://127.0.0.1:8080",
"https": "http://127.0.0.1:8080",
}
response = session.get(
"https://example.com/",
timeout=(5, 15),
)
response.raise_for_status()
trust_env=False 还会影响与环境有关的证书配置及自动 netrc 认证。选择前应考虑这些依赖。对于已批准的私有 CA 证书包,可以显式传入路径:
response = session.get(
"https://example.com/",
timeout=(5, 15),
verify="/path/to/approved-ca-bundle.pem",
)
使用实际获准的证书包,并保持验证开启。每种路由策略使用独立的 Session,避免在其他任务使用它时修改同一个 Session。
如果这两种方案都不能解释应用的路由,请在同一运行环境下、针对同一无害目标,对比隔离 Session 与应用。记录存在哪些代理变量、trust_env 的值,以及调用是否传入 proxies;共享日志中不要保留含凭据的 URL。隔离测试成功时,下一步应检查 Session 构造、适配器、预处理请求流程或自定义传输层。curl 的环境测试不能确定 Requests 自身的合并行为。