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>
manager中的代码
<!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>
login代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<h1>首页</h1>

</body>
</html>
index代码
#!/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()
下面是python代码
设计思想:
首先定义是个类:首页,登录,隐私页面,和退出类
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就会被清除
View Code

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")
View Code

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对象的主要方法

1void open(String method,String url,Boolen async)
用于创建请求
参数:
method: 请求方式(字符串类型),如POST  GET  DELETE...
url:     要请求的地址(字符串类型)
async:   是否异步(布尔类型)   如果为false那么就会夯住,所以一般设置为true

2void send(String body)
用于发送请求   发送数据到后台
参数:
body: 要发送的数据(字符串类型)

3void setRequestHeader(String header,String value)
用于设置请求头
参数:
    header: 请求头的key(字符串类型)
    value:  请求头的value(字符串类型)
User-Agent 根据用户发送的请求头的不同,来显示不同的设备


4、    String getAllResponseHeaders()
获取所有的响应头
返回值:
    相应头数据(字符串类型)

5、    String getResponseHeader(String header)
获取响应头中指定的header的值
参数:
    header:响应头key(字符串类型)
返回值:
响应头中指定的header对应的值

6void abort()
终止请求
View Code

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、4045006、    String statesText
状态文本(字符串),如ok 、NotFound
View Code

如果要用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>
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()
python代码
首先要明白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)
        })
    }
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',
    'static_path':'static',
}

# 下面第一个参数是HTML中的参数映射
application = tornado.web.Application([
    (r"/login", loginHandler),
], **settings)
 
 
if __name__ == "__main__":
    application.listen(8000)
    tornado.ioloop.IOLoop.instance().start()
python代码
用户点击登录的时候,这个页面会偷偷的执行post方法,首先发送url,之后发送输入的值,发送成功之后执行回调函数
View Code
原文地址:https://www.cnblogs.com/pyrene/p/6676343.html