Influxdb-Python 使用代理访问数据库

2017-12-11  本文已影响431人  cunfate

背景

最近在用 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'}

上一篇 下一篇

猜你喜欢

热点阅读