用户身份验证:在tornado中准备vs get_current_user

时间:2016-04-20 09:37:12

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

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

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

我对以下陈述感到困惑:

  

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

我不明白其中的两件事:

  1. 该文件的含义是get_current_user()可能不是协程? 可能不在这里意味着什么?它可以是一个协程,也可以不是。

  2. 如果需要异步操作,为什么需要后者表单,即get_current_user()?如果prepare() 可以一个协程并且get_current_user() 可能不,那么不应该prepare()用于异步操作吗?

  3. 我真的很感激任何帮助。

2 个答案:

答案 0 :(得分:2)

  1. 在这里,"可能不是协程"意味着"不允许是协程"或者"一定不能是协程"。使用的语言令人困惑,应该更改为说“不得”#34;。

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

  3. 的第二个示例

    总而言之,无论您是否需要协程,它总是可以覆盖prepare()并设置self.current_user。如果您不需要协程来获取当前用户,则可以覆盖get_current_user(),并在第一次访问self.current_user时自动调用它。你选择哪一个并不重要;你可以使用对你来说更自然的感觉。 (我们有两种不同方法的原因是get_current_user()较旧但我们必须使用不同的方法来处理协同程序)

答案 1 :(得分:0)

1

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

由于current_user是一个属性 - 它无法生成,因此get_current_user不能是协程功能。

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

2

在您引用的doc中,后一个示例是prepare的示例。