Когда я использую get_current_user () Мне нужно проверить несколько вещей в Redis (использование Торнадо-Redis) асинхронно.Получить текущего пользователя Async в Торнадо
Я делаю следующее:
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) # updates
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') # cfae7a25-2b8b-46a6-b5c4-0083a114c40e
user_id = yield gen.Task(c.hget, 'auths', auth_cookie) # 16
print(123, user_id)
return auth_cookie if auth_cookie else None
Например, я хочу использовать authenticated_async декоратора:
class IndexPageHandler(BaseClass, RequestHandler):
@authenticated_async
def get(self):
self.render("index.html")
Но у меня в консоли только .
Что-то не так? Как это исправить?
Спасибо!
UPDATE
Я обновил код с yield result
.
В auth_cookie У меня есть cfae7a25-2b8b-46a6-b5c4-0083a114c40e
.
Тогда я иду к терминалу:
127.0.0.1:6379> hget auths cfae7a25-2b8b-46a6-b5c4-0083a114c40e
"16"
Так,
user_id = yield gen.Task(c.hget, 'auths', auth_cookie)
print(123, user_id)
Возвратить
123 16
Но он возвращает один 123
UPDATE 1
С
class IndexPageHandler(BaseClass, RequestHandler):
@gen.coroutine
def get(self):
print('cookie', self.get_secure_cookie('user'))
user_async = yield self.get_current_user_async()
print('user_async', user_async)
print('current user', self.current_user)
self.render("index.html",)
В консоли у меня есть:
cookie b'cfae7a25-2b8b-46a6-b5c4-0083a114c40e'
123
user_async b'cfae7a25-2b8b-46a6-b5c4-0083a114c40e'
current user None
Если обернутый метод сам является сопрограммой coroutine, вы должны предоставить его при вызове из обертки authenticate_async ('result = method (* args, ** kwargs), если результат не равен None: result result') , Однако это не относится к этому «IndexPageHandler». Если вы добираетесь до утверждения print, похоже, что все асинхронные файлы работают, и вы просто получаете пустой результат из 'c.hget' (что бы это ни было). Если это не так, вы можете более четко узнать, что именно вы ожидаете и что видите вместо этого? –
@BenDarnell Я обновил сообщение. – tim
Работает ли он без декоратора? Что делать, если вы просто вызываете 'get_secure_cookie' и' c.hget' (или 'get_current_user_async') в' handler.get' напрямую? –