我希望使用Amazon的Elasticsearch服务器在Django数据库中搜索长文本字段。但是,我也不想向那些没有登录并且不想通过模糊性或某些IP限制策略依赖安全性的用户公开此搜索(除非它可以与现有的heroku应用完美配合,部署Django应用的位置)。
Haystack似乎在这方面还有很长的路要走,但是似乎没有一种简单的方法来配置它以使用Amazon的IAM凭据来访问Elasticsearch服务。它使用的是Elasticsearch- py中确实存在此功能。
https://elasticsearch-py.readthedocs.org/en/master/#running-with-aws- elasticsearch-service
from elasticsearch import Elasticsearch, RequestsHttpConnection from requests_aws4auth import AWS4Auth host = 'YOURHOST.us-east-1.es.amazonaws.com' awsauth = AWS4Auth(YOUR_ACCESS_KEY, YOUR_SECRET_KEY, REGION, 'es') es = Elasticsearch( hosts=[{'host': host, 'port': 443}], http_auth=awsauth, use_ssl=True, verify_certs=True, connection_class=RequestsHttpConnection ) print(es.info())
关于使用HTTP授权,我在https://github.com/django-haystack/django- haystack/issues/1046的问题下找到了它
from urlparse import urlparse parsed = urlparse('https://user:pass@host:port') HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 'URL': parsed.hostname, 'INDEX_NAME': 'haystack', 'KWARGS': { 'port': parsed.port, 'http_auth': (parsed.username, parsed.password), 'use_ssl': True, } } }
我想知道是否有一种方法可以将两者结合起来,类似于以下内容(由于不仅仅具有用户名和密码,这也产生了错误):
from requests_aws4auth import AWS4Auth awsauth = AWS4Auth([AACCESS_KEY],[SECRET_KEY],[REGION],'es') HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 'URL': [AWSHOST], 'INDEX_NAME': 'haystack', 'KWARGS': { 'port': 443, 'http_auth': awsauth, 'use_ssl': True, 'verify_certs': True } }, }
这里的错误:
TypeError at /admin/ must be convertible to a buffer, not AWS4Auth Request Method: GET Request URL: http://127.0.0.1:8000/admin/ Django Version: 1.7.7 Exception Type: TypeError Exception Value: must be convertible to a buffer, not AWS4Auth Exception Location: /usr/lib/python2.7/base64.py in b64encode, line 53
关于如何实现此目标的任何想法?
你是从成功的一步,加入connection_class到KWARGS如预期正常工作了。
connection_class
KWARGS
import elasticsearch HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 'URL': [AWSHOST], 'INDEX_NAME': 'haystack', 'KWARGS': { 'port': 443, 'http_auth': awsauth, 'use_ssl': True, 'verify_certs': True, 'connection_class': elasticsearch.RequestsHttpConnection, } }, }