如何解决Python 请求模块 - 它是否使用系统级在 Windows 上代理设置? 1.请求使用 urllib.request.getproxies 吗?2. urllib.request.getproxies 是否能够在 Windows 上获取操作系统代理配置?
背景
我有一个应用程序使用请求模块来处理与远程网络服务器的连接。这工作得很好,但我想使用企业代理服务器在组织内部署它。组织中的机器在操作系统级别配置了代理(即windows设置系统代理)。
我更愿意让我的应用自动使用已配置的操作系统代理设置,而不是向他们询问信息(尤其是当他们使用基本身份验证时,所以我必须安全地存储用户名/密码,而不仅仅是代理主机/端口)。
问题
如果您自己不直接指定代理,Requests 是否会自动使用操作系统的代理设置?
在阅读了 Request 的文档或底层的 urllib3 后,我找不到明确的答案。
在我的开发机器上,我没有要测试的代理,所以想在我去之前知道答案并在我的应用程序中编写手动代理处理,这实际上可能不是必需的...
更多信息
-
作为一个比较,Urllib 确实这样做了 - 参见 https://docs.python.org/3/library/urllib.request.html#urllib.request.ProxyHandler ...如果没有指定代理,它将使用系统配置的代理。
-
如果在我对 Request 文档的初步审查中看起来它没有使用系统配置,而是仅使用设置了环境变量的环境变量:https://2.python-requests.org/en/master/user/advanced/#proxies
-
但是,经过更多的挖掘,我找到了一种至少获取操作系统代理配置的方法,使用
urllib.request.getproxies()
:https://stackoverflow.com/a/16311657/9423009 -
此时我想我至少可以在运行时使用上述内容来获取操作系统代理配置,并将其传递给
requests
... -
...但后来我发现了这篇文章,其中指出
requests
will 如果未指定任何内容,则使用操作系统级别的配置:How to use requests library without system-configured proxies
因此,在这一点上,我无法在文档中找到关于请求或 urllib3 的明确答案,但是确实有一个 SO 帖子声明请求将通过调用 urllib.requests.getproxies()
本身使用操作系统级别的配置。
...那么任何人都可以确认/否认是这种情况吗?
谢谢!
解决方法
你的问题有两个方面
1.请求使用 urllib.request.getproxies 吗?
从 requests=2.25.1
版本开始,从 Session.request
source 开始,如果未提供,则从 self.merge_environment_settings
获取代理信息
if self.trust_env:
# Set environment's proxies.
no_proxy = proxies.get('no_proxy') if proxies is not None else None
env_proxies = get_environ_proxies(url,no_proxy=no_proxy)
而 get_environ_proxies
使用 getproxies
,即 either imported from urllib
(py2) or from urllib.request
(py3)。
所以答案是YES
2. urllib.request.getproxies 是否能够在 Windows 上获取操作系统代理配置?
据我所知,“操作系统配置的”在 Windows 上是不可靠的。至少在我的公司机器上,urllib.request.getproxies 不接代理。从它的文档或 ProxyHandler 中的文档中,它声明
如果没有设置代理环境变量,那么在 Windows 环境中,代理设置是从注册表的 Internet 设置部分获取的,而在 Mac OS X 环境中,代理信息是从 OS X 系统配置框架中检索的。
从 source code 我看到它在 HKEY_CURRENT_USER > 'Software\Microsoft\Windows\CurrentVersion\Internet Settings'
下读取,ProxyEnable
和 ProxyServer
的值。在我的机器上,配置了代理,这是空的 - 设置似乎存储在 Internet Explorer / .Net 堆栈中的某处。
请注意,在公司环境中,代理通常是从 .pac 设置的:
因此,至少在今天的 Windows 上得出结论,我们无法可靠地信任 urllib.request.getproxies
。这就是为什么我开发 envswitch
的原因是为了让我和我的同事非常容易地一键切换所有与代理相关的环境变量(家庭-火车-飞机/办公室)。至少 urllib
(和 requests
)在设置时可靠地使用它们。 (注意:即使工具的文档页面上有“构建失败”标志,该工具也能正常工作:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。