【问题标题】:User authentication: prepare vs get_current_user in tornado用户身份验证:在龙卷风中准备 vs get_current_user
【发布时间】:2016-08-12 21:19:41
【问题描述】:

我需要通过 Tornado 上运行的应用程序中的 cookie 对用户进行身份验证。我需要解析 cookie 并使用 cookie 内容从数据库加载用户。在查看Tornado RequestHandler documentation 时,有两种方法:

  • 通过覆盖RequestHandler 类的prepare() 方法。
  • 通过覆盖RequestHandler 类的get_current_user() 方法。

我对以下陈述感到困惑:

注意prepare() 可能是协程,而get_current_user() 可能 不是,所以如果加载用户需要后一种形式是必要的 异步操作。

我不明白其中的两件事:

  1. 文档中说get_current_user() 可能不是协程是什么意思? 可能不是在这里是什么意思?要么可以是协程,要么不能。

  2. 如果需要异步操作,为什么需要 latter 形式,即get_current_user()?如果prepare()可以是协程而get_current_user()可能不是,那么prepare()不应该用于异步操作吗?

我非常感谢任何帮助。

【问题讨论】:

    标签: python python-3.x tornado coroutine python-asyncio


    【解决方案1】:
    1. 这里,“可能不是协程”的意思是“不允许成为协程”或“不得成为协程”。使用的语言令人困惑,可能应该改为说“不得”。

    2. 同样,文档令人困惑:在这句话中首先提到了prepare(),但在这句话之前有两个例子,get_current_user 是第一位的。 “后者”指的是第二个例子,它使用了prepare()

    总之,不管你是否需要协程,它总是可以覆盖prepare() 并设置self.current_user。如果你不需要协程来获取当前用户,你可以覆盖get_current_user(),它会在第一次访问self.current_user 时自动调用。你选择哪一个并不重要。您可以使用对您来说更自然的任何一种。 (我们有两种不同方法的原因是 get_current_user() 比较老,但我们不得不为协程使用不同的方法)

    【讨论】:

      【解决方案2】:

      1

      获取当前用户的推荐方法是使用RequestHandler.current_user 属性。该属性实际上是一个函数,如果设置则返回RequestHandler._current_user,否则尝试通过调用get_current_user来设置。

      因为current_user 是一个属性——它不能被产生,因此get_current_user 不能是协程函数。

      当然可以,读取 cookie 并调用 db,以 get_current_user 验证用户身份,但只能以阻塞(同步)方式。

      2

      在你引用的doc中,后一个例子就是prepare的那个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多