我收到的网址为:
r = requests.get("http://myserver.com")
正如我在“myserver.com”的“access.log”中看到的,使用了客户端的系统代理。但我想通过
requests
完全禁用代理。
我目前知道的完全禁用代理的唯一方法如下:
session.trust_env
设置为 False
import requests
session = requests.Session()
session.trust_env = False
response = session.get('http://www.stackoverflow.com')
这是基于 Lukasa 的评论和
requests.Session.trust_env
的(有限)文档。
注意: 将
trust_env
设置为 False
也会忽略以下内容:
但是,如果您只想禁用特定域的代理(例如
localhost
),则可以使用NO_PROXY
环境变量:
import os
import requests
os.environ['NO_PROXY'] = 'stackoverflow.com'
response = requests.get('http://www.stackoverflow.com')
您可以为每个请求选择代理。来自文档:
import requests
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}
requests.get("http://example.org", proxies=proxies)
因此,要禁用代理,只需将每个代理设置为空字符串即可:
import requests
proxies = {
"http": "",
"https": "",
}
requests.get("http://example.org", proxies=proxies)
更新:从
None
切换为""
,请参阅评论。
停止 requests/urllib 代理任何请求的方法是将
no_proxy
(或 NO_PROXY
)环境变量设置为 *
,例如在bash中:
export no_proxy='*'
或者来自Python:
import os
os.environ['no_proxy'] = '*'
要理解为什么它有效,是因为 urllib.request.getproxies 函数首先检查环境变量中设置的任何代理(例如
http_proxy
、HTTP_PROXY
、https_proxy
、HTTPS_PROXY
等),或者如果没有设置后,它将使用特定于平台的调用检查系统配置的代理(例如,在 MacOS 上,它将使用系统 scutil/configd 接口进行检查,在 Windows 上,它将检查注册表)。正如评论中提到的,如果设置了任何代理变量,您可以按照@udani的建议重置它们,或者像这样从Python中取消设置它们:
del os.environ['HTTP_PROXY']
然后,当 urllib 尝试使用任何代理
proxyHandler
函数时,它将检查 no_proxy
环境变量的存在和设置 - 可以将其设置为如上所述的特定主机名,也可以设置特殊的 *
所有主机绕过代理的值。
使用Python3,jtpereyda的解决方案不起作用,但以下方法起作用了:
proxies = {
"http": "",
"https": "",
}
请求库尊重环境变量。 http://docs.python-requests.org/en/latest/user/advanced/#proxies
因此尝试删除环境变量 HTTP_PROXY 和 HTTPS_PROXY。
import os
for k in list(os.environ.keys()):
if k.lower().endswith('_proxy'):
del os.environ[k]
我在我们的生产代码库中实现了 @jtpereyda 的解决方案,该解决方案在正常成功的 HTTP 请求(200 OK)上运行良好,但是当接收到 HTTP 重定向(301 永久移动)时,此代码最终无法工作。 改为使用:
requests.get("https://pypi.org/pypi/pillow/9.0.0/json", proxies={"http": "", "https": ""})
为了比较,此行在代理后面时会导致 requests.exception.SSLError
(
pypi.org
尝试使用大写 P 将我们重定向到 Pillow):
requests.get("https://pypi.org/pypi/pillow/9.0.0/json", proxies={"http": None, "https": None})
r = requests.post('https://localhost:44336/api/',data='',verify=False)
在连接本地主机以使用 request
模块从 Python 脚本访问我的 .net 后端时,我遇到了同样的问题。我将
verify
设置为
False
,这会取消默认的 SSL 验证。P.s - 上面的代码会抛出一个警告,下面的代码可以忽略它
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
r=requests.post('https://localhost:44336/api/',data='',verify=False)
import os
import requests
os.environ['NO_PROXY'] = os.environ['NO_PROXY'] + ',' + 'stackoverflow.com'
response = requests.get('http://www.stackoverflow.com')
为未来的读者发布 LeDerp 对 Lukas Graf 的 answer 的评论。
no_proxy="*"
不起作用的人,请尝试
0.0.0.0/32
,这对我有用。
import requests
response = requests.get(https://google.com, proxies={})