我需要在Tornado上运行的应用程序中对cookie中的用户进行身份验证。我需要解析cookie并使用cookie内容从数据库加载用户。在查看Tornado RequestHandler documentation时,有两种方法:
prepare()
类的RequestHandler
方法。get_current_user()
类的RequestHandler
方法。我对以下陈述感到困惑:
请注意,
prepare()
可能是协程,而get_current_user()
可能是协同程序 不,如果加载用户需要,后一种形式是必要的 异步操作。
我不明白其中的两件事:
该文件的含义是get_current_user()
可能不是协程? 可能不在这里意味着什么?它可以是一个协程,也可以不是。
如果需要异步操作,为什么需要后者表单,即get_current_user()
?如果prepare()
可以一个协程并且get_current_user()
可能不,那么不应该prepare()
用于异步操作吗?
我真的很感激任何帮助。
答案 0 :(得分:2)
在这里,"可能不是协程"意味着"不允许是协程"或者"一定不能是协程"。使用的语言令人困惑,应该更改为说“不得”#34;。
同样,文档令人困惑:在这句话中首先提到prepare()
,但在此句之前是两个例子,get_current_user
是第一个。 "后者"是指使用prepare()
。
总而言之,无论您是否需要协程,它总是可以覆盖prepare()
并设置self.current_user
。如果您不需要协程来获取当前用户,则可以覆盖get_current_user()
,并在第一次访问self.current_user
时自动调用它。你选择哪一个并不重要;你可以使用对你来说更自然的感觉。 (我们有两种不同方法的原因是get_current_user()
较旧但我们必须使用不同的方法来处理协同程序)
答案 1 :(得分:0)
获取当前用户的推荐方法是使用RequestHandler.current_user
属性。该属性实际上是一个函数,如果设置则返回RequestHandler._current_user
,否则它会尝试通过调用get_current_user
来设置它。
由于current_user
是一个属性 - 它无法生成,因此get_current_user
不能是协程功能。
当然你可以读取cookie并调用db,在get_current_user
中对用户进行身份验证,但只能以阻塞(同步)方式进行身份验证。
在您引用的doc中,后一个示例是prepare
的示例。