阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

用户验证

368次阅读
没有评论

共计 2111 个字符,预计需要花费 6 分钟才能阅读完成。

一、说明

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

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

    结果:

用户验证

  • next 参数跳转

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

  • 示例

    修改登陆逻辑

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

    用户访问的网址顺序:
    用户验证

  • 完整代码

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

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-05-26发表,共计2111字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中