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
  • 相关阅读:
    【荐】说说CSS Hack 和向后兼容
    【阮一峰】深入研究URL编码问题及JavaScript相应的解决方案
    什么是H标签?H1,H2,H3标签?以及和strong标签使用的方法及重要性
    实用框架(iframe)代码
    数据库(SQLITE3函数总结): sqlite3_open, sqlite3_exec, slite3_close,sqlite3_prepare_v2,sqlite3_column_text,
    BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)
    c++中基本的语法问题
    RIP协议两个版本号对不连续子网的支持情况实验
    getChars的使用方法
    ios8中百度推送接收不到
  • 原文地址:https://www.cnblogs.com/pyrene/p/6676343.html
Copyright © 2011-2022 走看看