zoukankan      html  css  js  c++  java
  • 【python之路45】tornado的用法 (三)

    参考:https://www.cnblogs.com/sunshuhai/articles/6253815.html

    一、cookie用法补充

    1、cookie的应用场景

    浏览器端保存的键值对,每次访问都会携带

    1)用户验证,多长时间内免登陆

    2)后台管理,左侧隐藏,可以把隐藏的键值对保存在cookie中

    3)每页显示多少条数据也可以保存在cookie中

    设置cookie的方法:

    2、tornado在后台进行设置

    self.cookies  #获取所有的cookie

    self.setcookie("k1","999") #设置cookie

    self.getcookie("k1") #获取某个cookie

    3、浏览器端使用javascript进行设置或获取

    document.cookie  //获取所有cookie,返回的是字符串格式:"k1=9999",如果想获取k1的值,则通过处理字符串

    document.cookie = "k2=666"  //设置cookie,增加键值对 "k2=666"

    //重新获取下

    document.cookie   //结果:"k1=9999; k2=666"

    document.cookie = "k3=888;paht=/"   //表示增加键值对"k3=888",并且设置路径为全路径,再次获取时path是获取不到的,path表示参数设置

    <script>
        //设置cookie并设置超时时间
        function setCookie(name,value,expires) {
            //获取当前的时间
            var current_date = new Date();
            //当前时间的基础上+5秒
            current_date.setSeconds(current_date.getSeconds() + expires)
            //当前时间的基础上+5天
            //current_date.setDate(current_date.getDate() + expires)
            //设置cookie,并且设置超时时间为当前时间+5s
            //document.cookie = "k4=444;expires =" + current_date.toUTCString();
            document.cookie = name + "= " + value + ";expires=" + current_date.toUTCString();
        }
    </script>

    setCookie("k4","111",10)   //增加cookie键值对"k4=111" 并且设置10秒钟后失效

     document.cookie = "k5=555;domain=ssh.com"    //增加cookie键值对"k5=555" 并且设置域名为 ssh.com 

    secure  https使用

     4、浏览器Jquery操作cookie的方法

    首先使用Jquery中的cookie,先要下载静态文件jquery文件,并且引入

    再次,要下载Jquery制定的插件jQuery Cookie,下载地址,下载完毕后引用该静态文件

    导入Jquery和jQuery Cookie后就可以使用了

    $cookie("k6","6666") //增加设置cookie键值对"k6=666"

    $cookie("k7","777",{'path' :' ', 'domain' : '', 'expires' : 7})    //设置cookie ,并设置路径,域名,超时时间(是按照天数计算)

    $cookie("k8","888",{'expires' : 7})  //表示7天后过期

    如果想设置为6秒后过期,代码如下:

    var current_date = new Date();
    current_date.second(current_date.getSeconds() + 6);
    $.cookie('k1','v1',{'expires' : current_date})

     5、tornado带签名cookie原理

    tornado的加密原理:

    k1=v1   把v1做一个base64的加密

    v1|v1+时间戳+自定义字符串,然后把v1+时间戳+自定义字符串生成一个加密串

    v1|加密串|时间戳

    self.set_secure_cookie("k1","v1") #设置带签名的cookie
    self.get_secure_cookie("k1")  #返回的类型为字节类型
    str(self.get_secure_cookie("k1"),encoding="utf-8") == "v1"  #判断获取的带前面的值解密后是否等于v1

    6、自定义Session

    tornado本身是没有Session功能的,如果使用Session需要自定义Session

    其实Session是随机产生的一个字符串,用户登录后随机产生一个字符串作为Cookie,后台随机产生的Cookie与改用户的账户信息进行关联,前台携带这个Cookie来登录时通过这个随机字符串,来找到账户信息,从而返回该用户的其他信息。

    下面是Session的一个简单的例子:

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    import tornado.ioloop
    import tornado.web
    import hashlib
    import time
    container = {}
    
    class IndexHandler(tornado.web.RequestHandler):
        def get(self):
            ses = str(self.get_cookie("session",None))
            if ses in container:
                self.redirect('/manager')
            else:
                if self.get_argument('u',None) in ['alex','eric']:
                    obj = hashlib.md5()
                    bb =bytes(str(time.time()),encoding='utf-8')
                    obj.update(bb)
                    random_str = obj.hexdigest()
                    container[random_str] = {}
                    container[random_str]['account']= self.get_argument('u',None)
                    container[random_str]['islogin']=True
                    self.set_cookie('session',random_str)
                else:
                    self.write("请登录")
    class ManagerHandler(tornado.web.RequestHandler):
        def get(self):
            ses = str(self.get_cookie("session",None))
            if ses in container:
                self.write(container[ses]['account'] + '已登录到管理账户')
    settings = {
        'template_path':'views',
    }
    #路由映射
    application = tornado.web.Application([
        (r"/index", IndexHandler),
        (r'/manager',ManagerHandler),
    ],**settings)
    if __name__ == "__main__":
        application.listen(8888)
        tornado.ioloop.IOLoop.instance().start()
    自定义Session简单版
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    import tornado.ioloop
    import tornado.web
    container={}
    class Session:
    
        def __init__(self,handler):
            self.handler = handler
            self.random_hex = None
        def __genarate_random_str(self):
            import hashlib
            import time
            obj = hashlib.md5()
            random_str = bytes(str(time.time()), encoding='utf-8')
            obj.update(random_str)
            random_hex = obj.hexdigest()
            return random_hex
    
        #def set_value(self,key,value):
        def __setitem__(self, key, value):
            #为随机字符串key对应的value字典添加{key,value}
            if not self.random_hex:
                random_hex = self.handler.get_cookie("session")
                if not random_hex:
                    #客户端没有随机字符串,则创建
                    random_hex = self.__genarate_random_str()
                    container[random_hex] = {}
                else:
                    #客户端有随机字符串,如果不在container内也需要创建
                    if random_hex not in container:
                        random_hex = self.__genarate_random_str()
                        container[random_hex] = {}
                self.random_hex = random_hex
            # container={srandom_hex:{key:value}}
            container[self.random_hex][key] = value
            self.handler.set_cookie("session",self.random_hex)  #访问后重新设置cookie,超时时间继续延长
    
        #def get_value(self,key):
        def __getitem__(self, key):
            random_str = self.handler.get_cookie("session", None)
            #获取浏览器的字符串,并且字符串在container内
            if random_str and random_str in container:
                value =  container[random_str].get(key,None)
                return value
            else:
                return None
    
    class BaseHandler(tornado.web.RequestHandler):
        def initialize(self):
            self.session = Session(self)
    
    
    
    class IndexHandler(BaseHandler):
        def get(self):
            user = self.get_argument('u')
            if user in ['alex','sunshuhai']:
                #self.session.set_value('islogin',True)
                #self.session.set_value('user',user) #第2次没发请求
                self.session['islogin'] = True
                self.session['user']=user
                print(container)
            else:
                self.write("请登录!")
    class ManagerHandler(BaseHandler):
        def get(self):
            getValue = self.session["islogin"]
            if getValue:
                self.write( '已登录到管理账户')
            else:
                self.write('登录失败!')
    
    
    
    settings = {
        'template_path':'views',
    }
    #路由映射
    application = tornado.web.Application([
        (r"/index", IndexHandler),
        (r'/manager',ManagerHandler),
    ],**settings)
    if __name__ == "__main__":
        application.listen(8888)
        tornado.ioloop.IOLoop.instance().start()
    自定义Session基本完整版



    v1|加密串|时间戳

  • 相关阅读:
    econtrol窗体设计器
    脚本引擎注册将要使用的类,属性,方法,函数
    FastReport开发手册
    控制钱箱,客显,打印
    Laravel渴求式加载(比较容易理解理解load与with关系)
    50分钟学会Laravel 50个小技巧(基于laravel5.2,仅供参考)
    日期选择器date、week、time、datetime、datetimelocal类型
    input type=date时,时间数据回填,报错The specified value "2019040418" does not conform to the required format...
    Laravel技巧:使用load、with预加载 区别
    arcengine,C#实现分页打印预览
  • 原文地址:https://www.cnblogs.com/sunshuhai/p/9349678.html
Copyright © 2011-2022 走看看