ProxyError,当试图查询代理后面的普罗米修斯时
ProxyError, when trying to query prometheus behind the proxy
我正在编写一个需要查询 Prometheus 功能的模块,此时 Prometheus 位于代理后面,而模块正在从我的本地环境进行查询。我的开发环境在虚拟机中,具有正确的环境变量和 DNS 设置,并且能够与代理后面的 Prometheus 通信,例如访问前端 GUI。
我已经测试了我的 requests.get() 方法,当它在代理后面的网络上执行时它返回了正确的值,所以我非常肯定代理导致了问题,因为出于某种原因,我没有让程序尊重我为请求提供的代理字典。我正在使用 Visual Studio 代码和 Python 3.9.7.
当执行这个post底部的代码时,我得到了很多错误,其中最后一个是这个:(清除了一些值,例如代理服务器,url 并查询出来,由于隐私原因,它们在我的代码中是正确的和就地的)
requests.exceptions.ProxyError: HTTPSConnectionPool(host='', port=443): Max retries exceeded with url: / (Caused by ProxyError('Cannot connect to proxy.', RemoteDisconnected('Remote end closed connection without response')))
相关Python代码:
import requests
import json
http_proxy = ''
https_proxy = ''
ftp_proxy = ''
proxies = {
"http" : http_proxy,
"https" : https_proxy,
"ftp" : ftp_proxy
}
headers = {
'Content-Type': 'application/json',
}
response = requests.get(url='' + '/api/v1/query', verify=False, headers=headers, proxies=proxies, params={'query': ''}).text
j = json.loads(response)
print(j)
非常感谢任何帮助!
关于 no_proxy
对 Python 请求(例如:#4871, #5000)的缺失或错误支持,有几个未解决的错误。
目前 AFAICS 唯一的解决方案是在如下函数中编写缺失的逻辑:
import json
import requests
import tldextract
http_proxy = "http://PROXY_ADDR:PROXY_PORT"
https_proxy = "http://PROXY_ADDR:PROXY_PORT"
no_proxy = "example.net,.example.net,127.0.0.1,localhost"
def get_url(url, headers={}, params={}):
ext = tldextract.extract(url)
proxy_exceptions = [host for host in no_proxy.replace(' ', '').split(',')]
if (ext.domain in proxy_exceptions
or '.'.join([ext.subdomain, ext.domain, ext.suffix]) in proxy_exceptions
or '.'.join([ext.domain, ext.suffix]) in proxy_exceptions):
proxies = {}
else:
proxies = {
"http" : http_proxy,
"https" : https_proxy,
}
response = requests.get(url=url,
verify=False,
headers=headers,
params=params,
proxies=proxies)
return response
url = "https://example.net/api/v1/query"
headers = {
'Content-Type': 'application/json',
}
response = get_url(url, headers)
j = json.loads(response.text)
print(j)
我正在编写一个需要查询 Prometheus 功能的模块,此时 Prometheus 位于代理后面,而模块正在从我的本地环境进行查询。我的开发环境在虚拟机中,具有正确的环境变量和 DNS 设置,并且能够与代理后面的 Prometheus 通信,例如访问前端 GUI。
我已经测试了我的 requests.get() 方法,当它在代理后面的网络上执行时它返回了正确的值,所以我非常肯定代理导致了问题,因为出于某种原因,我没有让程序尊重我为请求提供的代理字典。我正在使用 Visual Studio 代码和 Python 3.9.7.
当执行这个post底部的代码时,我得到了很多错误,其中最后一个是这个:(清除了一些值,例如代理服务器,url 并查询出来,由于隐私原因,它们在我的代码中是正确的和就地的)
requests.exceptions.ProxyError: HTTPSConnectionPool(host='', port=443): Max retries exceeded with url: / (Caused by ProxyError('Cannot connect to proxy.', RemoteDisconnected('Remote end closed connection without response')))
相关Python代码:
import requests
import json
http_proxy = ''
https_proxy = ''
ftp_proxy = ''
proxies = {
"http" : http_proxy,
"https" : https_proxy,
"ftp" : ftp_proxy
}
headers = {
'Content-Type': 'application/json',
}
response = requests.get(url='' + '/api/v1/query', verify=False, headers=headers, proxies=proxies, params={'query': ''}).text
j = json.loads(response)
print(j)
非常感谢任何帮助!
关于 no_proxy
对 Python 请求(例如:#4871, #5000)的缺失或错误支持,有几个未解决的错误。
目前 AFAICS 唯一的解决方案是在如下函数中编写缺失的逻辑:
import json
import requests
import tldextract
http_proxy = "http://PROXY_ADDR:PROXY_PORT"
https_proxy = "http://PROXY_ADDR:PROXY_PORT"
no_proxy = "example.net,.example.net,127.0.0.1,localhost"
def get_url(url, headers={}, params={}):
ext = tldextract.extract(url)
proxy_exceptions = [host for host in no_proxy.replace(' ', '').split(',')]
if (ext.domain in proxy_exceptions
or '.'.join([ext.subdomain, ext.domain, ext.suffix]) in proxy_exceptions
or '.'.join([ext.domain, ext.suffix]) in proxy_exceptions):
proxies = {}
else:
proxies = {
"http" : http_proxy,
"https" : https_proxy,
}
response = requests.get(url=url,
verify=False,
headers=headers,
params=params,
proxies=proxies)
return response
url = "https://example.net/api/v1/query"
headers = {
'Content-Type': 'application/json',
}
response = get_url(url, headers)
j = json.loads(response.text)
print(j)