tornado十一:用户验证

用户验证:在接收到用户请求后,进行预先判断用户的认证状态(指是否登录)。若验证通过,则正常处理;否则进入到登录界面。

一、用户验证、访问首页:

用户登录路由:

            # 用户登录
            (r'/login', index.LoginHandler),

 

首页路由:

            (r'/', index.IndexHandler),

 

用户登录Handler:

class LoginHandler(RequestHandler):
    def get(self, *args, **kwargs):
        self.render('login.html')
    def post(self, *args, **kwargs):
        pass

 

用户登录模板:项目/templates/login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/login" method="post">
    {% module xsrf_form_html() %}
    姓名:<input type="text", name="username">
    <hr/>
    密码:<input type="password", name="pwd">
    <hr/>
    <input type="submit" value="登录">
    <button onclick="login"></button>
</form>

</body>
</html>

 

首页handler:

class Index1Handler(RequestHandler):
    def get(self, *args, **kwargs):
        self.render('index.html')

 

如何实现用户访问首页或登录页面时,如果没有登录,就返回登录页面?

使用tornado.web.authenticated装饰器和get_current_user()验证用户的方法实现。

 

二、实现首页验证

 

tornado.web.authenticated装饰器:tornado将确保这个方法的主体,只有合法的用户才能调用。

get_current_user():验证用户的逻辑应该写在该方法中。如果返回True,说明验证成功;否则验证失败。验证失败,则会重定向到配置中的login_url指定的路由。

示例:

将此装饰器放在首页handler的HTTP方法中,并重写get_current_user方法:

那么用户访问首页时,将验证用户是否登录;

如果登录了,则验证成功,可以访问首页;否则验证失败,不可以访问首页;

首页Handler:

class Index1Handler(RequestHandler):
    def get_current_user(self):
        return True
    @tornado.web.authenticated
    def get(self, *args, **kwargs):
        self.render('index.html')

 

配置login_url:

# config.py
# 配置,同django.settings
settings = {
    "login_url": "/login"
}

 

 

三、如果用户验证失败,仍然停留在登录页面

登录Handler:

登录验证成功,还需要增加cookie、token等,以保持状态;这里未考虑

class LoginHandler(RequestHandler):
    def get(self, *args, **kwargs):
        self.render('login.html')
    def post(self, *args, **kwargs):
        name = self.get_body_argument("username")
        pswd = self.get_body_argument("pwd")
        # 从数据库验证用户名和密码
        if name == "1" and pswd == "1":
       # 验证成功,增加状态保持的cookie....略
# 验证成功,返回上次的页面 next = self.get_argument("next", "/") # 返回上次的页面的时侯,要增加一个flag,标记,这是验证成功的。以便首页知道是验证成功的 self.redirect(next+"?flag=logined") else: # 验证失败,仍然重定向在登录页面增加 # 验证失败时,要保持原来的next页面,必须:一、取出next的值 # 二、修改login页面的登录地址,将next增加上;否则重定向到登录时,将保持不了原来的next值 next = self.get_argument("next", "/") self.redirect(next)

 

首页Handler:

class Index1Handler(RequestHandler):
    def get_current_user(self):
        flag = self.get_argument("flag", None)
     # 有flag,返回的值是真;否则返回None,是假 
return flag @tornado.web.authenticated def get(self, *args, **kwargs): self.render('index.html')

 

修改登录模板,增加上next:为了登录失败时,再次登录时,保留原来的next

<form action="/login?next=/home" method="post">
    {% module xsrf_form_html() %}
    姓名:<input type="text?next=/home", name="username">
    <hr/>
    密码:<input type="password", name="pwd">
    <hr/>
    <input type="submit" value="登录">
    <button onclick="login"></button>
</form>

 

问题,上面的模板中写死了next的值。怎么让它为变量值?

 

四、返回任何上次的页面

将模板中的next的值,修改为变量

<form action="{{ url }}" method="post">
    {% module xsrf_form_html() %}
    姓名:<input type="text?next=/home", name="username">
    <hr/>
    密码:<input type="password", name="pwd">
    <hr/>
    <input type="submit" value="登录">
    <button onclick="login"></button>
</form>

 

在登录页面,开始登录之前,取得变量值url:登录url + 上次页面的next值

class LoginHandler(RequestHandler):
    def get(self, *args, **kwargs):
        next = self.get_argument("next", "/")
        url = "/login?next=" + next
        self.render('login.html', url=url)
    def post(self, *args, **kwargs):
        name = self.get_body_argument("username")
        pswd = self.get_body_argument("pwd")
        # 从数据库验证用户名和密码
        if name == "1" and pswd == "1":
            # 验证成功,返回上次的页面
            next = self.get_argument("next", "/")
            # 返回上次的页面的时侯,要增加一个flag,标记,这是验证成功的。以便首页知道是验证成功的
            self.redirect(next+"?flag=logined")
        else:
            # 验证失败,仍然重定向在登录页面增加
            # 验证失败时,要保持原来的next页面,必须:一、取出next的值
            # 二、修改login页面的登录地址,将next增加上;否则重定向到登录时,将保持不了原来的next值
            next = self.get_argument("next", "/")
            self.redirect(next)

 

posted on 2018-07-31 23:44  myworldworld  阅读(228)  评论(0)    收藏  举报

导航