2016-04-30 3 views
2

У меня есть обработчики, которые обрабатывают запрос с помощью метода get и post, я хочу использовать аутентификацию с помощью моего собственного декоратора, а не самого торнадо @ tornado.web.authenticated decorator , В моем обычном декораторе мне нужно запросить db для идентификации пользователя, но db-запрос в торнадо асинхронно с @ gen.coroutine.Как использовать сопрограмму в пользовательском декораторе при работе с операциями db в торнадо

Мои коды:

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 

но произошли erros, когда доступ к нему:

Traceback (most recent call last): File "/Users/moonmoonbird/Documents/kuolie/lib/python2.7/site-packages/tornado/web.py", line 1443, in _execute result = method(*self.path_args, **self.path_kwargs) TypeError: 'Future' object is not callable

может кто-нибудь встретить это прежде, чем это правильно способ писать пользовательские декоратор для аутентификации с помощью операции async db? заранее спасибо

ответ

4

Декоратор должен быть синхронным; это функция , она возвращает, что является сопрограммой. Вам нужно изменить:

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

To:

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