用户认证:prepare vs get_current_user in tornado
User authentication: prepare vs get_current_user in tornado
我需要通过 Tornado 上应用程序 运行 中的 cookie 对用户进行身份验证。我需要解析 cookie 并使用 cookie 内容从数据库加载用户。查看 Tornado RequestHandler documentation 时,有两种方法:
- 通过覆盖
RequestHandler
class 的 prepare()
方法。
- 通过覆盖
RequestHandler
class 的 get_current_user()
方法。
我对以下陈述感到困惑:
Note that prepare()
may be a coroutine while get_current_user()
may
not, so the latter form is necessary if loading the user requires
asynchronous operations.
里面有两点我不明白:
文档说 get_current_user()
可能不是协程是什么意思?这里的 may not 是什么意思?要么可以是协程,要么不能。
如果需要异步操作,为什么需要后者形式,即get_current_user()
?如果 prepare()
可以是 协程并且 get_current_user()
可能不会 ,那么不应该使用 prepare()
对于异步操作?
我将非常感谢对此的任何帮助。
1
获取当前用户的推荐方法是使用RequestHandler.current_user
属性。这个 属性 实际上是一个函数,它 returns RequestHandler._current_user
如果设置,否则它会尝试通过调用 get_current_user
.
来设置它
因为 current_user
是一个 属性 - 它不能被 yield,因此 get_current_user
不能是协程函数。
当然可以,读取 cookie 并调用数据库,在 get_current_user
中对用户进行身份验证,但只能以阻塞(同步)方式进行。
2
在你引用的doc中,后一个例子是prepare
。
这里,"may not be a coroutine"表示"is not allowed to be a coroutine"或"must not be a coroutine"。使用的语言令人困惑,可能应该改为 "must not"。
同样,文档令人困惑:在这句话中首先提到 prepare()
,但在这句话之前有两个例子,get_current_user
是第一个。 "Latter" 指的是使用 prepare()
.
的第二个示例
所以总而言之,不管你是否需要协程,覆盖prepare()
和设置self.current_user
总是有效的。如果您不需要协程来获取当前用户,您可以改写 get_current_user()
,它会在第一次访问 self.current_user
时自动调用。选择哪一个并不重要。您可以使用您觉得更自然的任何一种。 (我们有两种不同方法的原因是 get_current_user()
较旧,但我们必须对协程使用不同的方法)
我需要通过 Tornado 上应用程序 运行 中的 cookie 对用户进行身份验证。我需要解析 cookie 并使用 cookie 内容从数据库加载用户。查看 Tornado RequestHandler documentation 时,有两种方法:
- 通过覆盖
RequestHandler
class 的prepare()
方法。 - 通过覆盖
RequestHandler
class 的get_current_user()
方法。
我对以下陈述感到困惑:
Note that
prepare()
may be a coroutine whileget_current_user()
may not, so the latter form is necessary if loading the user requires asynchronous operations.
里面有两点我不明白:
文档说
get_current_user()
可能不是协程是什么意思?这里的 may not 是什么意思?要么可以是协程,要么不能。如果需要异步操作,为什么需要后者形式,即
get_current_user()
?如果prepare()
可以是 协程并且get_current_user()
可能不会 ,那么不应该使用prepare()
对于异步操作?
我将非常感谢对此的任何帮助。
1
获取当前用户的推荐方法是使用RequestHandler.current_user
属性。这个 属性 实际上是一个函数,它 returns RequestHandler._current_user
如果设置,否则它会尝试通过调用 get_current_user
.
因为 current_user
是一个 属性 - 它不能被 yield,因此 get_current_user
不能是协程函数。
当然可以,读取 cookie 并调用数据库,在 get_current_user
中对用户进行身份验证,但只能以阻塞(同步)方式进行。
2
在你引用的doc中,后一个例子是prepare
。
这里,"may not be a coroutine"表示"is not allowed to be a coroutine"或"must not be a coroutine"。使用的语言令人困惑,可能应该改为 "must not"。
同样,文档令人困惑:在这句话中首先提到
prepare()
,但在这句话之前有两个例子,get_current_user
是第一个。 "Latter" 指的是使用prepare()
. 的第二个示例
所以总而言之,不管你是否需要协程,覆盖prepare()
和设置self.current_user
总是有效的。如果您不需要协程来获取当前用户,您可以改写 get_current_user()
,它会在第一次访问 self.current_user
时自动调用。选择哪一个并不重要。您可以使用您觉得更自然的任何一种。 (我们有两种不同方法的原因是 get_current_user()
较旧,但我们必须对协程使用不同的方法)