对于 HTTP 代理发来的 Basic 质询,请使用 ProxyBasicAuthHandler。这个普通 HTTP 示例把路由和账号放在同一个 opener 中:

import os
from urllib.request import (
    ProxyHandler, ProxyBasicAuthHandler,
    HTTPPasswordMgrWithDefaultRealm, build_opener,
)

proxy_url = 'http://proxy.example:8080'
passwords = HTTPPasswordMgrWithDefaultRealm()
passwords.add_password(
    None, proxy_url,
    os.environ['PROXY_USER'], os.environ['PROXY_PASSWORD'],
)
opener = build_opener(
    ProxyHandler({'http': proxy_url}),
    ProxyBasicAuthHandler(passwords),
)
with opener.open('http://example.com/', timeout=10) as response:
    print(response.status)

请使用真实端点与运维人员提供的账号。该处理器 会为代理的质询使用密码管理器;请匹配预期的代理 URI 与 realm。目标站点的 Basic 身份验证 使用另一个处理器。

直接调用 opener 可以让这套设置保持本地。请求 URL 仍然是网站,而不是中间代理。这条明文 HTTP 路由不会加密 Basic 交换。

不要从本示例推断它支持 HTTPS 隧道。CONNECT 期间的 407 发生在建立阶段,早于普通的目标站点响应;所选集成必须在那里处理身份验证。更改网站登录处理器无法修复更早出现的那个质询。

带凭据的代理 URL 是旧示例中出现的另一种格式。如果使用,请正确编码 URL 分隔符,并确保生成的含密钥 URL 不进入日志。

相关文章