刚刚开始用 Tornado。
在用户认证时,我覆写了 BaseHandler,以便使用内置的 current_user() 方法与 is_authenticated 修饰器。
class BaseHandler(tornado.web.RequestHandler):
def get_current_user(self):
return self.get_secure_cookie('user')
在某步中,我加了判断 if self.current_user then xxx,此时即便登录了也无法执行 xxx,如果我把判断写成 if self.get_current_user then xxx,便能成功确认登录,xxx 就执行了。
请问这可能是什么问题?
1
gx 2015-07-28 01:30:27 +08:00 1
`self.current_user`可以当作是`get_current_user`的一个缓存,如果你复写的`get_current_user`在第一次返回None的话,之后使用`self.current_user`是直接读取缓存的结果。
解决方案: 当你做登陆操作时,除了`set_secure_cookie`之外,可以给current_user赋值: ``` user = {'id': "v2ext208772", 'name': "roychan"} self.current_user = user ``` |
2
roychan OP |
3
mulog 2015-07-28 08:52:17 +08:00 1
你可以看看你说的那两个东西的实现
https://github.com/tornadoweb/tornado/blob/master/tornado/web.py 如果你的 get_current_user() 真的就只是读 cookie 的话 我觉得这两的返回会是一致的呀 |
4
roychan OP @mulog
正如一楼所说,get_current_user 方法在调用 current_user 方法时会被调用一次,然后将自身的 _current_user 属性设置为当前用户,以后直接调用自身属性,此为「缓存」。 假设:我现在要求访问登录页面也需要登录。那么在访问登录页面之前,需要调用一次 current_user 这个方法(也是属性)来验证是否登录。如果用户未登录,此时 current_user 值便成为了 None,即便登录后,使用 current_user 属性来验证的话,也依旧是 NoneType。 我想在不覆写 Tornado 源代码的情况下最大化实现其内置功能。如果还要自己加一个属性,那么我感觉设置安全 cookie 的验证步骤可以省去了(除了用来保持登录)。 |
6
siteshen 2015-07-28 09:30:48 +08:00 via iPhone
POST /login 后应该返回302,而不是继续停留在 /login 页面。
|
10
roychan OP 那如何解决手动访问登录页的问题呢…
|