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

0 投票
1 回答
1948 浏览
提问于 2025-04-16 20:15

我现在正在使用Tornado和asyncmongo来创建一个可以访问mongodb的网站。一切运行得很好,除了当我需要在处理器的单个请求中对mongodb进行多次请求时。我希望所有的数据库调用都是异步的,这样服务器就不会被阻塞。

我该怎么做呢?有几种情况我需要从多个集合中获取不同的文档。有时候我还需要在第二次查询中使用第一次查询得到的数据,比如外键。当我渲染模板时,我也需要这两个请求的数据。

谢谢!

1 个回答

4

每个请求都触发不同的回调函数吗?

比如说:(我没有测试这个,而且对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)

撰写回答