背景
最近在用 influxdb 存一些设备信息,留作实时监控之用,然后想自己写一个类似grafana的东西玩。于是选择了 python 的 flask 做后端框架,与 influx 的接口就选择了官方推荐的 influxDB-Python。
问题
公司使用的代理访问外网,平时就都用内网地址上网,也给 ubuntu 设置了内网地址作为全局的 proxy 。于是在调用
influx = InfluxDBClient(host='www.example.com', port=8086, username='root',
database='mydb')
influx.write_points(something)
时遇到了问题,抛出异常提示 403 forbidden。
甩锅
日常被代理坑的我就立刻想到是代理的问题,然后觉得肯定有代理设置的 api ,然后查了一下文档,果然发现了InfluxDBClient
的api里
class influxdb.InfluxDBClient(host=u'localhost', port=8086, username=u'root', password=u'root', database=None, ssl=False, verify_ssl=False, timeout=None, retries=3, use_udp=False, udp_port=4444, proxies=None)
是有proxies
的选项的,然而却不知道应该用怎样的形式去给它赋值。于是查看了一下源代码,发现它所有的网络请求都是通过self.request()
方法来完成的,而这个方法的关键操作就是
while retry:
try:
response = self._session.request(
method=method,
url=url,
auth=(self._username, self._password),
params=params,
data=data,
headers=headers,
proxies=self._proxies,
verify=self._verify_ssl,
timeout=self._timeout
)
break
except (requests.exceptions.ConnectionError,
requests.exceptions.HTTPError,
requests.exceptions.Timeout):
_try += 1
if self._retries != 0:
retry = _try < self._retries
if method == "POST":
time.sleep((2 ** _try) * random.random() / 100.0)
if not retry:
raise
# if there's not an error, there must have been a successful response
if 500 <= response.status_code < 600:
raise InfluxDBServerError(response.content)
elif response.status_code == expected_response_code:
return response
else:
raise InfluxDBClientError(response.content, response.status_code)
都是通过self._session
这个私有对象来做的,然后发现self._session
其实就是一个requests.Session
对象,所以proxies
参数用requests
的形式传入就行了。
结论
查手册,传入格式如下:
proxies={'http_proxy': 'username:pwd@host:port'}
网友评论