【python之路45】tornado的用法 (三)

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

1、cookie用法补充html

一、cookie的应用场景java

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

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

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

3)每页显示多少条数据也能够保存在cookie中浏览器

设置cookie的方法:cookie

二、tornado在后台进行设置session

self.cookies  #获取全部的cookieapp

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

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

三、浏览器端使用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使用

 四、浏览器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})

 五、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

六、自定义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|加密串|时间戳

相关文章
相关标签/搜索