How to set current_user in Tornado asynchronously

Something that I’ve missed when working on setting the current_user upon @tornado.web.authenticated.

Normally, you’d set get_current_user(self) in the RequestHandler which is used by @tornado.web.authenticated to pull/query the current_user that is logged on.

It is fine until you start to utilize asynchronous functions within the get_current_user(self).

Quick notes:

  • get_current_user(self) cannot be a coroutine. So no @tornado.gen.coroutine decorator before it. This also means that it cannot perform yield functions from elsewhere.
  • when required to use a async function to pull user information, use prepare(self) instead.

This will look something like:

@gen.coroutine
def prepare(self):
    user_id_cookie = self.get_secure_cookie("user_id")
    if user_id_cookie:
        self.current_user = yield load_user(user_id_cookie)

Reference