你如何使用 boto3 的 HTTP/HTTPS 代理?
How do you use an HTTP/HTTPS proxy with boto3?
旧的 boto
库很简单,在打开连接时可以使用 proxy
、proxy_port
、proxy_user
和 proxy_pass
参数.但是,我找不到任何以编程方式在 boto3 上定义代理参数的等效方法。 :(
如果您的用户代理服务器没有密码
尝试以下操作:
import os
os.environ["HTTP_PROXY"] = "http://proxy.com:port"
os.environ["HTTPS_PROXY"] = "https://proxy.com:port"
如果您的用户代理服务器有密码
尝试以下操作:
import os
os.environ["HTTP_PROXY"] = "http://user:password@proxy.com:port"
os.environ["HTTPS_PROXY"] = "https://user:password@proxy.com:port"
除了更改环境变量外,我将展示我在代码中发现的内容。
由于boto3使用了botocore,所以翻了一下源码:
从这个 link,我们最终在:
def _get_proxies(self, url):
# We could also support getting proxies from a config file,
# but for now proxy support is taken from the environment.
return get_environ_proxies(url)
...由 proxies = self._get_proxies(final_endpoint_url)
在 EndpointCreator
class 中调用。
长话短说,如果您使用 python2,它将使用 urllib2 中的 getproxies
方法,如果您使用 python3,它将使用 urllib3。
get_environ_proxies
期待一个包含 {'http:' 'url'}
的字典(我猜也是 https
)。
您总是可以 patch
代码,但这是不好的做法。
这是我推荐猴子补丁的罕见情况之一,至少在 Boto 开发人员允许特定连接的代理设置之前:
import botocore.endpoint
def _get_proxies(self, url):
return {'http': 'http://someproxy:1234/', 'https': 'https://someproxy:1234/'}
botocore.endpoint.EndpointCreator._get_proxies = _get_proxies
import boto3
从至少版本 1.5.79 开始,botocore 在 botocore 配置中接受一个 proxies
参数。
例如
import boto3
from botocore.config import Config
boto3.resource('s3', config=Config(proxies={'https': 'foo.bar:3128'}))
boto3 资源
https://boto3.readthedocs.io/en/latest/reference/core/session.html#boto3.session.Session.resource
botocore 配置
https://botocore.readthedocs.io/en/stable/reference/config.html#botocore.config.Config
旧的 boto
库很简单,在打开连接时可以使用 proxy
、proxy_port
、proxy_user
和 proxy_pass
参数.但是,我找不到任何以编程方式在 boto3 上定义代理参数的等效方法。 :(
如果您的用户代理服务器没有密码 尝试以下操作:
import os
os.environ["HTTP_PROXY"] = "http://proxy.com:port"
os.environ["HTTPS_PROXY"] = "https://proxy.com:port"
如果您的用户代理服务器有密码 尝试以下操作:
import os
os.environ["HTTP_PROXY"] = "http://user:password@proxy.com:port"
os.environ["HTTPS_PROXY"] = "https://user:password@proxy.com:port"
除了更改环境变量外,我将展示我在代码中发现的内容。
由于boto3使用了botocore,所以翻了一下源码:
从这个 link,我们最终在:
def _get_proxies(self, url):
# We could also support getting proxies from a config file,
# but for now proxy support is taken from the environment.
return get_environ_proxies(url)
...由 proxies = self._get_proxies(final_endpoint_url)
在 EndpointCreator
class 中调用。
长话短说,如果您使用 python2,它将使用 urllib2 中的 getproxies
方法,如果您使用 python3,它将使用 urllib3。
get_environ_proxies
期待一个包含 {'http:' 'url'}
的字典(我猜也是 https
)。
您总是可以 patch
代码,但这是不好的做法。
这是我推荐猴子补丁的罕见情况之一,至少在 Boto 开发人员允许特定连接的代理设置之前:
import botocore.endpoint
def _get_proxies(self, url):
return {'http': 'http://someproxy:1234/', 'https': 'https://someproxy:1234/'}
botocore.endpoint.EndpointCreator._get_proxies = _get_proxies
import boto3
从至少版本 1.5.79 开始,botocore 在 botocore 配置中接受一个 proxies
参数。
例如
import boto3
from botocore.config import Config
boto3.resource('s3', config=Config(proxies={'https': 'foo.bar:3128'}))
boto3 资源 https://boto3.readthedocs.io/en/latest/reference/core/session.html#boto3.session.Session.resource
botocore 配置 https://botocore.readthedocs.io/en/stable/reference/config.html#botocore.config.Config