zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    POJ-1189 钉子和小球(动态规划)
    POJ-1191-棋盘分割(动态规划)
    Java实现 LeetCode 730 统计不同回文子字符串(动态规划)
    Java实现 LeetCode 730 统计不同回文子字符串(动态规划)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 728 自除数(暴力)
    Java实现 LeetCode 728 自除数(暴力)
    Java实现 LeetCode 728 自除数(暴力)
  • 原文地址:https://www.cnblogs.com/pyrene/p/6676343.html
Copyright © 2011-2022 走看看