Несколько вызовов базы данных в асинхронном запросе с Tornado - PullRequest
0 голосов
/ 25 июня 2011

В настоящее время я использую Tornado и asyncmongo для создания веб-сайта, который обращается к mongodb. Все работает отлично, за исключением случаев, когда мне нужно сделать несколько запросов к mongodb за один запрос к моему обработчику. Я хотел бы сохранить все вызовы базы данных асинхронными, чтобы на сервере не было блокировок.

Как мне это сделать? Есть несколько случаев, когда мне нужно получить разные документы из нескольких коллекций. Мне также иногда нужно использовать данные, которые я извлек из моего первого запроса во втором, такие как внешний ключ. Мне также понадобятся данные из обоих запросов при рендеринге моего шаблона.

Спасибо!

1 Ответ

4 голосов
/ 25 июня 2011

Каждый запрос вызывает другой обратный вызов?

например (я не проверял это, и я не знаком с asyncmongo, поэтому он, вероятно, содержит ошибки):

import asyncmongo
import tornado.web

class Handler(tornado.web.RequestHandler):

    @tornado.web.asynchronous
    def get(self, id):
        self.id = id
        self.db = asyncmongo.Client(pool_id='mypool', host='localhost', 
            port=27107, dbname='mydb')

        self.db.users.find_one({'username': self.current_user}, 
            callback=self.on_user)

    def on_user(self, response, error):
        if error:
            raise tornado.web.HTTPError(500)
        self.user = response
        self.db.documents.find_one({'id': self.id, 'user': self.user}, 
            callback=self.on_document)

    def on_document(self, response, error):
        if error:
            raise tornado.web.HTTPError(500)
        self.render('template', first_name=self.user['first_name'],
            document=response)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...