Python 请求模块 - 它是否使用系统级(windows)代理设置?
Python Requests module - does it use system level (on windows) proxy settings?
背景
我有一个应用程序使用请求模块来处理与远程网络服务器的连接。这非常有效,但我想使用企业代理服务器在组织内部署它。组织中的机器在操作系统级别配置了代理(即 windows 设置系统代理)。
我希望我的应用程序自动使用已配置的 OS 代理设置,而不必向他们询问信息(尤其是当他们使用基本身份验证,所以我必须安全地存储 username/password,而不仅仅是代理 host/port)。
问题
如果您不自己直接指定代理,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
但是,经过更多的挖掘,我找到了一种至少获得 OS 代理配置的方法,使用 urllib.request.getproxies()
:
此时我想我至少可以在 运行 时使用上面的方法来获取 OS 代理配置,并将其传递给 requests
...
...但后来我发现了这个 post,其中指出 requests
将 使用 OS如果未指定级别配置:How to use requests library without system-configured proxies
所以,在这一点上,我无法在请求或 urllib3 的文档中找到明确的答案,但确实有一个 SO post 声明请求将使用 OS 级别配置,通过调用 urllib.requests.getproxies()
本身。
...所以有谁能confirm/deny是这样吗?
谢谢!
你的问题有两个方面
1。请求是否使用 urllib.request.getproxies ?
从版本 requests=2.25.1
开始,来自 Session.request
source, if not provided, proxy information is obtained from 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
uses getproxies
that is either imported from urllib
(py2) or from urllib.request
(py3).
所以答案是是
2。 urllib.request.getproxies 是否能够在 windows 上获取 OS 代理配置?
据我所知,“OS 配置的”在 windows 上不可靠。至少在我的公司机器上,urllib.request.getproxies does not pick up the proxy. From its documentation or from the one in ProxyHandler 它说
If no proxy environment variables are set, then in a Windows environment proxy settings are obtained from the registry’s Internet Settings section, and in a Mac OS X environment proxy information is retrieved from the OS X System Configuration Framework.
从 source code 我看到它在 HKEY_CURRENT_USER > 'Software\Microsoft\Windows\CurrentVersion\Internet Settings'
下读取,ProxyEnable
和 ProxyServer
的值。在我的机器上,配置了代理,这是空的——设置似乎存储在 Internet Explorer/.Net 堆栈中的某个地方。
请注意,在公司环境中,代理通常是从 .pac 设置的:
因此,至少在今天就 windows 得出结论,我们不能可靠地信任 urllib.request.getproxies
。这就是为什么我开发 envswitch
来让我和我的同事非常容易地一键切换所有 proxy-related 环境变量,来回 (home-train-plane/office)。至少 urllib
(和 requests
)在设置它们时可靠地使用它们。 (注意:即使工具的文档页面上有“构建失败”标志,该工具也能正常工作 :))
背景
我有一个应用程序使用请求模块来处理与远程网络服务器的连接。这非常有效,但我想使用企业代理服务器在组织内部署它。组织中的机器在操作系统级别配置了代理(即 windows 设置系统代理)。
我希望我的应用程序自动使用已配置的 OS 代理设置,而不必向他们询问信息(尤其是当他们使用基本身份验证,所以我必须安全地存储 username/password,而不仅仅是代理 host/port)。
问题
如果您不自己直接指定代理,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
但是,经过更多的挖掘,我找到了一种至少获得 OS 代理配置的方法,使用
urllib.request.getproxies()
:此时我想我至少可以在 运行 时使用上面的方法来获取 OS 代理配置,并将其传递给
requests
......但后来我发现了这个 post,其中指出
requests
将 使用 OS如果未指定级别配置:How to use requests library without system-configured proxies
所以,在这一点上,我无法在请求或 urllib3 的文档中找到明确的答案,但确实有一个 SO post 声明请求将使用 OS 级别配置,通过调用 urllib.requests.getproxies()
本身。
...所以有谁能confirm/deny是这样吗?
谢谢!
你的问题有两个方面
1。请求是否使用 urllib.request.getproxies ?
从版本 requests=2.25.1
开始,来自 Session.request
source, if not provided, proxy information is obtained from 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
uses getproxies
that is either imported from urllib
(py2) or from urllib.request
(py3).
所以答案是是
2。 urllib.request.getproxies 是否能够在 windows 上获取 OS 代理配置?
据我所知,“OS 配置的”在 windows 上不可靠。至少在我的公司机器上,urllib.request.getproxies does not pick up the proxy. From its documentation or from the one in ProxyHandler 它说
If no proxy environment variables are set, then in a Windows environment proxy settings are obtained from the registry’s Internet Settings section, and in a Mac OS X environment proxy information is retrieved from the OS X System Configuration Framework.
从 source code 我看到它在 HKEY_CURRENT_USER > 'Software\Microsoft\Windows\CurrentVersion\Internet Settings'
下读取,ProxyEnable
和 ProxyServer
的值。在我的机器上,配置了代理,这是空的——设置似乎存储在 Internet Explorer/.Net 堆栈中的某个地方。
请注意,在公司环境中,代理通常是从 .pac 设置的:
因此,至少在今天就 windows 得出结论,我们不能可靠地信任 urllib.request.getproxies
。这就是为什么我开发 envswitch
来让我和我的同事非常容易地一键切换所有 proxy-related 环境变量,来回 (home-train-plane/office)。至少 urllib
(和 requests
)在设置它们时可靠地使用它们。 (注意:即使工具的文档页面上有“构建失败”标志,该工具也能正常工作 :))