美文网首页Python从0到1
(2018-05-29.Python从Zero到One)8、(T

(2018-05-29.Python从Zero到One)8、(T

作者: lyh165 | 来源:发表于2018-05-29 23:33 被阅读0次

    6.3 用户验证

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

    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"
    )
    
    

    想一想,完成登陆操作后应该进入哪个页面?

    day61_tornado-安全应用-01.png

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

    修改登陆逻辑:

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

    用户访问的网址顺序:

    day61_tornado-安全应用-02.png

    相关文章

      网友评论

        本文标题:(2018-05-29.Python从Zero到One)8、(T

        本文链接:https://www.haomeiwen.com/subject/ldpzjftx.html