elasticsearch,proxy,Python,elasticsearch,Proxy" /> elasticsearch,proxy,Python,elasticsearch,Proxy" />

Elasticsearch/Python/Proxy

Elasticsearch/Python/Proxy,python,elasticsearch,proxy,Python,elasticsearch,Proxy,我是stackoverflow的新手,所以如果我犯了错误,我很抱歉 我必须编写一个python脚本,用Elasticsearch收集一些数据,然后将数据写入数据库。我正在努力用elasticsearch收集数据,因为我工作的公司有一个代理 脚本在没有代理的情况下工作。。但我不知道如何将代理设置传递给Elasticsearch 以下代码在没有代理的情况下工作: es = Elasticsearch(['https://user:password@logs.net/elasticsearch'])

我是stackoverflow的新手,所以如果我犯了错误,我很抱歉

我必须编写一个python脚本,用Elasticsearch收集一些数据,然后将数据写入数据库。我正在努力用elasticsearch收集数据,因为我工作的公司有一个代理

脚本在没有代理的情况下工作。。但我不知道如何将代理设置传递给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')