В чем проблема.
Во время вызова
get_current_user() в Торнадо нужно выполнить некоторые асинхронные запросы.
Попытки сделать
get_current_user() асинхронным не увенчались успехом, поэтому было принято решение написать свой велосипед.
def authenticated_async(method):
@gen.coroutine
def wrapper(self, *args, **kwargs):
self._auto_finish = False
self.current_user = yield gen.Task(self.get_current_user_async)
if not self.current_user:
self.redirect(self.reverse_url('login'))
else:
result = method(self, *args, **kwargs)
if result is not None:
yield result
return wrapper
class BaseClass():
@gen.coroutine
def get_current_user_async(self,):
auth_cookie = self.get_secure_cookie('user')
user_id = yield gen.Task(c.hget, 'auths', auth_cookie)
print(123, user_id)
return auth_cookie if auth_cookie else None
В примере используется
Redis, откуда берем значение из
hash.
Проблема в том, что когда использую декоратор
@authenticated_async, то в консоли должен быть вывод не только одинокого 123. Пример:
class IndexPageHandler(BaseClass, RequestHandler):
@authenticated_async
def get(self):
self.render("index.html")
В чем проблема, почему
user_id пуст и как это исправить?
Может, кто-то уже делал метод
get_current_user() асинхронным, поделитесь реализацией.
Спасибо!