使用Tornado在异步请求中调用多个数据库

时间:2011-06-25 04:32:44

标签: python mongodb asynchronous tornado

我目前正在使用Tornado和asyncmongo创建一个访问mongodb的网站。一切都很好,除非我需要在对我的处理程序的单个请求中向mongodb发出多个请求。我想保持所有数据库调用异步,以便服务器上没有阻塞。

我怎样才能做到这一点?在某些情况下,我需要从多个集合中检索不同的文档。我有时也需要使用从第一个查询中检索到的数据,例如外键。在渲染模板时,我还需要来自两个请求的数据。

谢谢!

1 个答案:

答案 0 :(得分:4)

让每个请求触发不同的回调吗?

e.g。 (我没有测试过这个,我对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)