web框架详解之tornado 二 cookie
一、tornado之cookie一
目录:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <a href="/logout">退出</a> <h1>银行卡余额</h1> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <form action="/login" method="post"> <input type="text" name="username"/> <input type="password" name="password"/> <input type="submit" value="登录"/> <span style="color: red;">{{status_text}}}</span> </form> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>首页</h1> </body> </html>
#!/usr/bin/env python # -*- coding:utf-8 -*- import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.render('index.html') class LogoutHandler(tornado.web.RequestHandler): def get(self): self.set_cookie("auth","0") self.redirect("/login") class managerHandler(tornado.web.RequestHandler): def get(self): # 下面是判断,如果key等于value那么就登录到,否则跳转 co=self.get_cookie("auth") if co=="1": self.render('manager.html') else: self.redirect("/login") class loginHandler(tornado.web.RequestHandler): def get(self): self.render('login.html',status_text="") def post(self): username=self.get_argument("username",None) pwd=self.get_argument("password",None) if username=="aa"and pwd=="bb": self.set_cookie("auth","1") self.redirect("/manager") else: self.render("login.html",status_text="登录失败") settings = { 'template_path': 'views', } # 下面第一个参数是HTML中的参数映射 application = tornado.web.Application([ (r"/index", MainHandler), (r"/manager", managerHandler), (r"/login", loginHandler), (r"/logout", LogoutHandler), ], **settings) if __name__ == "__main__": application.listen(8000) tornado.ioloop.IOLoop.instance().start()
设计思想: 首先定义是个类:首页,登录,隐私页面,和退出类 1、 登录代码中首先在post中接收用户用户输入的账号密码 2、 然后用set_cookie来设置cookie,并且跳转到指定页面,否则就返回登录页面,并且自定义一个参数为登录失败,这个参数 由于在post中设置,所以也要在get方法中去设置 3、 在隐私页面中判断,如果cookie等于设置的,那么就可以跳转到这个页面,否则返回去 4、 在隐私页面中设置退出,并且修改cookie 方法: self.set_cookie(“key”,”value”,) 设置cookie self.get_cookie(“key”,”value”) 获取cookie self.redirect(“/login”) 跳转
1、 用户首先登录login,之后在form中填写内容,进行post提交,提交的时候如果输入的内容和设计的内容相等,那么就会这只cookie的值为1,并且跳转到manager页面。 2、 这个时候如果用户没有登录想直接登录manager页面,这个时候就会进行判断设置的cookie,如果不对,那么就会跳转到登录页面。 3、 如果用户登录成功就可以登录隐私页面logout页面,在这个里面定义一个退出,如果用户点击这个退出,那么cookie就会被清除
cookie(二)
1、 自动登录
首先在login页面中form中写入 <input type="checkbox" name="auto" value="1"/>7天免密码 之后在login类中进行判断,如果用户点击了checkbox那么就会保存7天 class loginHandler(tornado.web.RequestHandler): def get(self): self.render('login.html',status_text="") def post(self): username=self.get_argument("username",None) pwd=self.get_argument("password",None) check=self.get_argument("auto",None) if username=="aa"and pwd=="bb": if check: # self.get_secure_cookie() self.set_cookie("username",username,expires_days=7) self.set_cookie("auth","1",expires_days=7) else: r=time.time()+10 self.set_cookie("auth","1",expires=r) self.redirect("/manager") else: self.render("login.html",status_text="登录失败")
2、设置cookie参数
1 set_cookie 中的参数如下: 2 domin:域名 用于区分域名 3 expires:超出时间 单位秒 4 path=”” 设置权限,有些cookie只能在某些url下生效 如果等于 \,那么默认在全局中生效 5 expires_day:设置超出时间 ,单位天 6 7 如果要设置立即过期:expires=time.time(),即时间设置成当天时间,就是立即过期 8 下面就是进入到隐私页面之后,cookie直接立即过期
class LogoutHandler(tornado.web.RequestHandler): def get(self): self.set_cookie("auth","1",expires=time.time()) self.redirect("/login")
3、 tornado自带的设置cookie的方法
1 用下面的方法 2 self.get_secure_cookie() 3 但是必须在配置中加入 4 settings = { 5 'template_path': 'views', 6 "cookie_secret":"sdwdzxc", 这个配置中必须加入,value的值随意设置 7 }
4、利用ajax
初始原生ajax
Ajax依赖于浏览器,在主流浏览器中都有XMLHttpRequest这个模块,并且通过这个模块就可以和后台发送消息了
XMLHttpRequest实现Ajax上 XMLHttpRequest对象方法和属性的讲解
request是客户端发向服务器端的请求,response是服务器端对客户端的响应,两者发出对象与接收对象不同
在XMLHttpRequest对象的主要方法
1、 void open(String method,String url,Boolen async) 用于创建请求 参数: method: 请求方式(字符串类型),如POST GET DELETE... url: 要请求的地址(字符串类型) async: 是否异步(布尔类型) 如果为false那么就会夯住,所以一般设置为true 2、 void send(String body) 用于发送请求 发送数据到后台 参数: body: 要发送的数据(字符串类型) 3、void setRequestHeader(String header,String value) 用于设置请求头 参数: header: 请求头的key(字符串类型) value: 请求头的value(字符串类型) User-Agent 根据用户发送的请求头的不同,来显示不同的设备 4、 String getAllResponseHeaders() 获取所有的响应头 返回值: 相应头数据(字符串类型) 5、 String getResponseHeader(String header) 获取响应头中指定的header的值 参数: header:响应头key(字符串类型) 返回值: 响应头中指定的header对应的值 6、 void abort() 终止请求
XMLHttpRequest对象的主要属性
1、 Number readystate 状态值(整数) 详细: 0- 未初始化,尚未调用open()方法 1- 启动,调用了open()方法,没有调用send()方法 2- 发送,已经调用了send()方法,未接到响应 3- 接收,已经接受到部分响应数据 4- 完成,已经接受到所有相应数据 2、 Function onreadystatechange 当readystate的值改变时自动触发执行其对应的函数(回调函数) 3、 String responseText 服务器返回的数据(字符串类型) 4、XmlDocument responseXML 服务器返回的数据(xml对象) 5、 Number states 状态码(整数),如200、404、500、 6、 String statesText 状态文本(字符串),如ok 、NotFound
如果要用post方式来发送的时候,必须要设置请求头,get方式的时候不需要设置
下面例子就是用ajax后台登陆
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <input id="user" type="text" name="username"/> <input id="pwd" type="password" name="password"/> <input id="check" type="checkbox" name="auto" value="1"/>7天免密码 <input type="button" value="登录" onclick="SubmitForm()"/> <script> // 下面只要状态变更,就会调用回调函数func xhr=null; function SubmitForm(){ xhr=new XMLHttpRequest(); xhr.open("POST","/login",true); xhr.onreadystatechange=func; 上面是post方法,所以下面必须设置请求头,get方法不用设置 xhr.setRequestHeader("content-Type","application/x-www-form-urlencoded;charset=UTF-8") xhr.send("username="+document.getElementById('user').value+";password="+document.getElementById('pwd').value); } function func(args){ if(xhr.readyState==4){ console.log(1); // 服务器发送什么,就返回什么 console.log(xhr.responseText); var data=xhr.responseText; //把字符串解析成一个对象 var ret_dict=JSON.parse(data); // 这里表示ajax状态成功,状态为4的时候得到这个对象,有这个对象那么就是成功登录 if(ret_dict.statu){ }else{ alert("账号密码错误") } } } </script> </body> </html>
#!/usr/bin/env python # -*- coding:utf-8 -*- import tornado.ioloop import tornado.web import time class loginHandler(tornado.web.RequestHandler): def get(self): self.render("login.html") def post(self,*args,**kwargs): dic={"statu":True,"message":""} user=self.get_argument("username") pwd=self.get_argument("password") if user=="aa"and pwd=="123": pass else: dic["statu"]=False dic["message"]="用户名或者密码错误" import json self.write(json.dumps(dic)) # 注意这里只能接收字符串 # self.write("ok") settings = { 'template_path': 'views', } # 下面第一个参数是HTML中的参数映射 application = tornado.web.Application([ (r"/login", loginHandler), ], **settings) if __name__ == "__main__": application.listen(8000) tornado.ioloop.IOLoop.instance().start()
首先要明白response是服务器向客户端发送信息
request是客户端向服务端发送信息
首先在html代码中,接收客户端向服务端发送请求,到后台post方法中,在post方法中判断,并且给客户端返回信息,这个时候状态发生改变,所以执行func方法,并且获取到服务器向客户端发送的数据 ,把发送的字符串转化成对象,判断这个对象中的statu的值(,由于在post方法中如果用户帐号密码正确那么statu对应的值是true,错误对应的值为false,)如果为true,那么就什么也不输出,否则就输出alert
初始jqueryAjax
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <input id="user" type="text" name="username"/> <input id="pwd" type="password" name="password"/> <input id="check" type="checkbox" name="auto" value="1"/>7天免密码 <input type="button" value="登录" onclick="SubmitForm()"/> <script src="{{static_url('jquery.js')}}}"></script> <script> function SubmitForm(){ $.post("/login",{"username":$("#user").val(),"password":$("#pwd").val()},function(callback){ console.log(callback) }) }
#!/usr/bin/env python # -*- coding:utf-8 -*- import tornado.ioloop import tornado.web import time class loginHandler(tornado.web.RequestHandler): def get(self): self.render("login.html") def post(self,*args,**kwargs): dic={"statu":True,"message":""} user=self.get_argument("username") pwd=self.get_argument("password") if user=="aa"and pwd=="123": pass else: dic["statu"]=False dic["message"]="用户名或者密码错误" import json self.write(json.dumps(dic)) # 注意这里只能接收字符串 # self.write("ok") settings = { 'template_path': 'views', 'static_path':'static', } # 下面第一个参数是HTML中的参数映射 application = tornado.web.Application([ (r"/login", loginHandler), ], **settings) if __name__ == "__main__": application.listen(8000) tornado.ioloop.IOLoop.instance().start()
用户点击登录的时候,这个页面会偷偷的执行post方法,首先发送url,之后发送输入的值,发送成功之后执行回调函数