Я пытаюсь заставить установку Tornado-Elasticsearch-Mongodb работать прямо сейчас.После того, как Tornado.web.RequestHandler
получит запрос на поиск, запрос будет отправлен на серверasticsearch через API REST с помощью Tornado.curl_httpclient.CurlAsyncHTTPClient.fetch()
.fetch
вызывает обратный вызов с результатами, поэтому на данный момент RequestHandler находится вне области видимости, поэтому я больше не могу писать HTTPResponse.Я полагаю, что могу вложить обратный вызов внутри моего подкласса RequestHandler, но у меня сложилось впечатление, что это не лучшая идея в асинхронном программировании.Есть ли волшебный способ Python, чтобы объединить мои методы?Вот части, которые я хочу объединить:
from pymongo import Connection
from pymongo.objectID import ObjectId
from tornado.curl_httpclient import CurlAsyncHTTPClient
from tornado.httpclient import HTTPRequest
from tornado.web import RequestHandler, Application
from tornado.ioloop import IOLoop
import json
mongo_conn = Connection()
db = 'a_db'
collection = 'a_collection'
es_conn = CurlAsyncHTTPClient()
def get_mongo_data(id_list):
print list(mongo_conn[db][collection].find({"_id":{"$in":id_list}}))
# want to RequestHandler.write() here
def handle_search(response):
if response.error:
print "Error", response.error
else:
body = json.loads(response.body)
id_list = []
results = body['hits']['hits']
if len(results) > 0:
collection = results[0]['_type']
for r in results:
id_list.append(ObjectId(r['_id']))
if len(id_list) > 0:
get_mongo_data(id_list)
else:
# want RequestHandler.write("no matches found")
else:
# RequestHandler.write("no matches found")
def search(query):
url = '127.0.0.1:9250/%s/%s/_search' % (db, collection)
content = '{"query":{"term":{"field":"%s"}}}' % query
request = HTTPRequest(url, body=content, allow_nonstandard_methods=True)
es_conn.fetch(request, handle_search)
class SearchHandler(RequestHandler):
def get(self):
search('foo') # hack for now
if __name__=='__main__':
application = Application([
(r'/', SearchHandler),
])
application.listen(8888)
IOLoop.instance().start()