как использовать сопрограмму в пользовательском декораторе при работе с операциями БД в торнадо

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

Мои коды:

обработчики.ру;

 @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

но при доступе к нему произошли ошибки:

Трассировка (последний последний вызов): файл «/Users/moonmoonbird/Documents/kuolie/lib/python2.7/site-packages/tornado/web.py», строка 1443, в _execute result = method(*self.path_args, **self.path_kwargs) TypeError: объект «Будущее» не вызывается

Может ли кто-нибудь встретить это раньше, как правильно написать собственный декоратор для аутентификации с помощью асинхронной операции с базой данных? заранее спасибо~


person Peng Kim    schedule 30.04.2016    source источник


Ответы (1)


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

@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
person jonrsharpe    schedule 30.04.2016