在龙卷风中使用db操作时如何在自定义装饰器中使用coroutine

时间:2016-04-30 07:07:36

标签: python tornado tornado-motor

我有使用get和post方法处理请求的处理程序,我想使用我自己的自定义装饰器进行身份验证,而不是龙卷风本身@ tornado.web.authenticated装饰器。在我的自定义装饰器中,我需要查询数据库以识别用户,但龙卷风中的数据库查询与@ gen.coroutine异步。

我的代码是:

handlers.py;

 @account.utils.authentication
    @gen.coroutine
    def get(self, page):

帐户/ utils.py:

@tornado.gen.coroutine
def authentication(fun):
    def test(self,*args, **kwargs    ):
        print(self)
        db = self.application.settings['db']
        result = yield db.user.find()
        r = yield result.to_list(None)
        print(r)
    return test

但访问它时发生了错误:

  

Traceback(最近一次调用最后一次):文件   “/Users/moonmoonbird/Documents/kuolie/lib/python2.7/site-packages/tornado/web.py”   第1443行,在_execute中       result = method(* self.path_args,** self.path_kwargs)TypeError:'Future'对象不可调用

任何人都可以满足这个要求,编写自定义装饰器以使用异步数据库操作进行身份验证的正确方法是什么?提前谢谢〜

1 个答案:

答案 0 :(得分:4)

装饰者需要同步;它返回的函数是一个协程。你需要改变:

@tornado.gen.coroutine
def authentication(fun):
    def test(self, *args, **kwargs):
        ...
    return test

要:

def authentication(fun):
    @tornado.gen.coroutine  # note
    def test(self, *args, **kwargs):
        ...
    return test