用户验证
- 指再受到用户请求后进行预先判断用户的认证状态(是否登录),若验证通过则正常处理,否则进入到登录界面
tornado.web.authenticated装饰器
- 作用:tornado将确保这个方法的主体只有合法的用户才能调用
get_current_user()
-
功能:验证用户的逻辑因该写在该方法中,如果该方法返回的为True说明验证成功,否则验证失败
-
验证失败,请求会将访客重定向到配置中的login_url所指定的路由
-
整体逻辑:
用户在没有登录的情况下进入home和cart页面是不被允许的 所以在home 和 cart 对应的视图函数中添加get_current_user()方法并在config中配置 重定向路由。这样用户被重定向到登录函数中:http://127.0.0.1:8080/login?next=%2Fcart 登录函数中先用GET方法render到login页面上,再用POST获取”next“参数。 登录成功则重定向到POST请求过来的next参数对应的地址,并在此基础上加入一个标识:flag参数 到达next指定的路由函数中先get_current_user()验证 是否存在flag参数 True 则进入 装饰器,进入到home或者cart页面 FALSE 则进入config.py中的重定向路由中 登录不成功就重定向回login?next=%2F上面next对应的地址 但是这里有个问题如果html的form中的action不知道回滚过来的next是cart还是home是不行的 所以在 登录函数中GET方法中先获取网址上的next参数,然后将参数的值与"login?next"合并传给 login页面,这样form就知道该重定向到哪了
-
config.py中添加setting:
"login_url":"/login"
-
login.html
// action的地址不能写死 <form action="{{url}}" method="post"> {% module xsrf_form_html() %} 。。。。。。 </form>
-
views
# 用户验证 class loginHandler(RequestHandler): def get(self, *args, **kwargs): next = self.get_argument("next","/") print("get:",next) url = "login?next="+next self.render("login.html",url=url) # 获取form表单 def post(self, *args, **kwargs): name = self.get_body_argument("username") pawd = self.get_body_argument("password") next = self.get_argument("next", "/") if name == "1" and pawd == "1": # 获取到网址上面的next参数,获取不到 就是"/" print("postYes",next) # 登录成功重定向到next 并设置GET参数:flag=logined self.redirect(next+"?flag=logined") else: self.redirect("/login?next="+next) print("postno",next) class homeHanler(RequestHandler): # 没登陆直接进入home网址:http://127.0.0.1:8080/login?next=%2Fhome # %2F 的意思时 "/" # 验证用户逻辑方法 def get_current_user(self,*args,**kwargs): # 检查GET中是否有flag flag = self.get_argument("flag",None) return flag # 用户验证成功可以进入该装饰器中 @tornado.web.authenticated def get(self, *args, **kwargs): self.render("home.html") class cartHandler(RequestHandler): def get_current_user(self,*args,**kwargs): # 检查GET中是否有flag flag = self.get_argument("flag",None) return flag # 用户验证成功可以进入该装饰器中 @tornado.web.authenticated def get(self, *args, **kwargs): self.render("cart.html")
-