组团学

用户验证

阅读 (156278)

一、说明

用户验证是指在收到用户请求后进行处理前先判断用户的认证状态(如登陆状态),若通过验证则正常处理,否则强制用户跳转至认证页面(如登陆页面)

二、authenticated装饰器

  • 说明

    为了使用Tornado的认证功能,我们需要对登录用户标记具体的处理函数。我们可以使用@tornado.web.authenticated装饰器完成它。当我们使用这个装饰器包裹一个处理方法时,Tornado将确保这个方法的主体只有在合法的用户被发现时才会调用

  • 示例

    class ProfileHandler(RequestHandler): @tornado.web.authenticated def get(self): self.write("这是我的个人主页。")

三、get_current_user()方法

  • 说明:

    装饰器@tornado.web.authenticated的判断执行依赖于请求处理类中的self.current_user属性,如果current_user值为假(None、False、0、""等),任何GET或HEAD请求都将把访客重定向到应用设置中login_url指定的URL,而非法用户的POST请求将返回一个带有403(Forbidden)状态的HTTP响应

    在获取self.current_user属性的时候,tornado会调用get_current_user()方法来返回current_user的值。也就是说,我们验证用户的逻辑应写在get_current_user()方法中,若该方法返回非假值则验证通过,否则验证失败

  • 示例

    class ProfileHandler(RequestHandler): def get_current_user(self): """在此完成用户的认证逻辑""" user_name = self.get_argument("name", None) return user_name @tornado.web.authenticated def get(self): self.write("这是我的个人主页。")

四、login_url 设置

  • 说明

    当用户验证失败时,将用户重定向到login_url上,所以我们还需要在Application中配置login_url

  • 示例

    class LoginHandler(RequestHandler): def get(self): """在此返回登陆页面""" self.write("登陆页面") app = tornado.web.Application( [ (r"/", IndexHandler), (r"/profile", ProfileHandler), (r"/login", LoginHandler), ], "login_url":"/login" )

    结果:

login_url_next.png

  • next 参数跳转

    在login_url后面补充的next参数就是记录的跳转至登录页面前的所在位置,所以我们可以使用next参数来完成登陆后的跳转

  • 示例

    修改登陆逻辑

    class LoginHandler(RequestHandler): def get(self): """登陆处理,完成登陆后跳转回前一页面""" next = self.get_argument("next", "/") self.redirect(next+"?name=logined")

    用户访问的网址顺序:
    login_return_pre.png

  • 完整代码

    import tornado.web,os import tornado.ioloop import tornado.httpserver from tornado.web import RequestHandler class ProfileHandler(RequestHandler): def get_current_user(self): """在此完成用户的认证逻辑""" user_name = self.get_argument("name", None) return user_name @tornado.web.authenticated def get(self): # 获取当前用户 print(self.current_user) self.write("这是我的个人主页。") class LoginHandler(RequestHandler): def get(self): """在此返回登陆页面""" self.write("登陆页面") if __name__ == "__main__": app = tornado.web.Application([ (r"/profile", ProfileHandler), (r"/login", LoginHandler), ], login_url="/login", debug=True, autoreload=True, template_path=os.path.join(os.path.dirname(__file__),'templates'), ) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(8000) tornado.ioloop.IOLoop.current().start()
需要 登录 才可以提问哦