Торнадо - передача RequestHandler методу с обратным вызовом для вызова RequestHanlder.write асинхронно - PullRequest
0 голосов
/ 07 марта 2012

Я пытаюсь заставить установку 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...