Elasticsearch/Python/Proxy
我是stackoverflow的新手,所以如果我犯了错误,我很抱歉 我必须编写一个python脚本,用Elasticsearch收集一些数据,然后将数据写入数据库。我正在努力用elasticsearch收集数据,因为我工作的公司有一个代理 脚本在没有代理的情况下工作。。但我不知道如何将代理设置传递给Elasticsearch 以下代码在没有代理的情况下工作:Elasticsearch/Python/Proxy,python,
elasticsearch,proxy,Python,
elasticsearch,Proxy,我是stackoverflow的新手,所以如果我犯了错误,我很抱歉 我必须编写一个python脚本,用Elasticsearch收集一些数据,然后将数据写入数据库。我正在努力用elasticsearch收集数据,因为我工作的公司有一个代理 脚本在没有代理的情况下工作。。但我不知道如何将代理设置传递给Elasticsearch 以下代码在没有代理的情况下工作: es = Elasticsearch(['https://user:password@logs.net/elasticsearch'])
es = Elasticsearch(['https://user:password@logs.net/elasticsearch'])
res = es.search(index=index, body=request, search_type="count")
当我支持代理时,我尝试了以下操作:
es = Elasticsearch(['https://user:password@logs.net/elasticsearch'], _proxy = 'http://proxy.org', _proxy_headers = {'basic_auth': 'user:pw'})
res = es.search(index=index, body=request, search_type="count")
return res
有没有人知道我必须传递给Elasticsearch的关键字,以便它使用代理
任何帮助都很好
谢谢。我在GitHub上得到了答案: 再次感谢你
from elasticsearch import RequestsHttpConnection
class MyConnection(RequestsHttpConnection):
def __init__(self, *args, **kwargs):
proxies = kwargs.pop('proxies', {})
super(MyConnection, self).__init__(*args, **kwargs)
self.session.proxies = proxies
es = Elasticsearch([es_url], connection_class=MyConnection, proxies = {'https': 'http://user:pw@proxy.org:port'})
print(es.info())
一般来说,我们不需要为代理添加额外的代码,python底层模块应该能够直接使用系统代理(即http_proxy) 在以后的版本(至少6.x)中,我们可以使用
请求
模块而不是urlib3
来很好地解决这个问题,请参阅
另一个可能的问题是search
默认使用GET
方法,它被我的旧缓存服务器(squid/3.19)拒绝,应添加额外的参数send\u GET\u body\u as
,请参阅
# make sure the http_proxy is in system env
from elasticsearch import Elasticsearch, RequestsHttpConnection
es = Elasticsearch([es_url], connection_class=RequestsHttpConnection)
from elasticsearch import Elasticsearch
es = Elasticsearch(send_get_body_as='POST')