tornado 用户验证

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

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参数就是记录的跳转至登录页面前的所在位置,所以我们可以使用next参数来完成登陆后的跳转。

修改登陆逻辑:

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

用户访问的网址顺序:

 

 

 1 import tornado.web
 2 import tornado.ioloop
 3 import tornado.options
 4 import os
 5 import time
 6 
 7 tornado.options.define('port',type=int,default=8006,help='服务器端口')
 8 
 9 class IndexHandler(tornado.web.RequestHandler):
10     def get_current_user(self):
11         """在此完成用户的认证逻辑"""
12         f=self.get_argument('f','')
13         if f:
14             return True
15         else:
16             return False
17 
18     @tornado.web.authenticated  #检查用户是否登录,未登录则重定向到login_url
19     def get(self):
20         self.write('这是我的个人主页') #已登录
21 
22 
23 class LoginIndex(tornado.web.RequestHandler):
24     def get(self):
25         """登陆处理,完成登陆后跳转回前一页面"""
26         next_url=self.get_argument('next','')  #在login_url后面补充的next参数(固定写法)就是记录的跳转至登录页面前的所在位置,所以我们可以使用next参数来完成登陆后的跳转。即从哪儿进则从哪儿出
27         if next_url:
28             self.redirect(next_url+"?f=login")
29         else:
30             self.write('no login')
31 
32 
33 class Application(tornado.web.Application):
34     def __init__(self,*args,**kwargs):
35         super().__init__(*args,**kwargs)
36 
37 
38 if __name__ == '__main__':
39     tornado.options.parse_command_line()
40 
41     current_path = os.path.dirname(__file__)
42 
43     settings=dict(
44         static_path=os.path.join(current_path,'statics')  #通过向web.Application类的构造函数传递一个名为static_path的参数来告诉Tornado从文件系统的一个特定位置提供静态文件
45         ,template_path=os.path.join(current_path,'templates')
46         ,debug=True
47         ,login_url='/login'   #用户验证失败时,将用户重定向到login_url
48     )
49 
50     app=Application(
51         [(r'/',IndexHandler),
52          (r'/login',LoginIndex),
53          ]
54         ,**settings)
55 
56     app.listen(tornado.options.options.port)
57     tornado.ioloop.IOLoop().current().start()

跳转顺序:

 

posted on 2020-04-06 18:14  cherry_ning  阅读(344)  评论(0)    收藏  举报

导航