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) 收藏 举报
浙公网安备 33010602011771号