第一种情况:没有设置缓存:执行相对应的setitem等方法进行,保存到字典里面

cookies_dic={}
print(cookies_dic)
class Session():
def __init__(self,handler):
self.user_id=None
self.handler=handler###这个handler是传过来的requetys对象,注明一下,这个handler是request对象

##接受到传过来的参数
recv_user_id=self.handler.get_cookie('session_id')#去当前的requets对象里面拿到这个session_id
print('查看是否存在这个session_id',recv_user_id)
#进行判断看是否是存在着的用户,非法的用户
if not recv_user_id :
##不存在的话,就是新用户
self.user_id=self.create_random_str()
cookies_dic[self.user_id]={}
else:
##判断是否是非法的用户,存在user_id,单数不在cookies_dic里面可以找的得到
if recv_user_id not in cookies_dic:
print('非法用户')
self.user_id=self.create_random_str()
cookies_dic[self.user_id]={}
else:
print('正常')
print('查看是否存在这个session_id', recv_user_id)

self.user_id=self.create_random_str()
import time
ctime=time.time()
self.handler.set_cookie('session_id',self.user_id,expires=ctime+3600)#设置cookies
##设置超时时间为30乘以60秒,就是30分钟

def create_random_str(self):
import hashlib
m=hashlib.md5()

m.update(bytes(str(self.user_id),encoding='utf-8'))

return m.hexdigest()

def __setitem__(self, key, value):
##注意一下,这个handler是reqeuts对象,对cookie_dic进行设置
print('进行设置setitem')
print('这个key是',key)
print('value',value)
cookies_dic[self.user_id][key]=value######self是reqeust对象

def __getitem__(self, key):
return cookies_dic[self.user_id][key]

class FOO():
def initialize(self):
print('执行FOO函数')
self.session=Session(self)##传入参数进去,requets
# super(FOO,self).initialize()

class HomeHandler(FOO,tornado.web.RequestHandler):
def get(self, *args, **kwargs):
print(self.session['user'])
print('进入到home页面')
self.write('home')

class Login(FOO,tornado.web.RequestHandler):
def get(self, *args, **kwargs):
self.session['user']='yunxin'##当进行这个操作的时候,会进行setitem操作,key和vakue
self.session['status']='is_true'

self.redirect('/home')

import tornado.ioloop

application=tornado.web.Application([
(r'/login',Login),
(r'/home', HomeHandler),
])

application.listen(8000)
tornado.ioloop.IOLoop.instance().start()

执行流程讲解:
首先当你访问某个页面的时候,比如login的页面的时候,会设置session访问的用户,和状态(在注册的时候就已经设置
了该用户session到服务器里面),然后会走到index页面,此时已经带有session之后的值了,request.session['user']已经
设置好值了,然后当执行父类的方法的时候,就会设置cookie,首先进行判断,是否该用户是已经存在的用户,在cookie
缓存数据库里面,reqeust.get_cookie('session_id'),如果不存在的话,就创建改用户的cookie缓存,dic['session_id']={}
如果存在的话,就进行判断看改用户是否是非法的(就是说session_id存在,但是不匹配里面的cookie数据库),所以也被被认为
不存在改用户,所以创建改用户的cookie数据库,当在cookie数据库里面存在改过来访问的session_id的时候,就说明是已经匹配
成功了,就执行下面的步骤
reqeust.set_cookie('session_id','xxxxx',expires=60*多少),保存到requets.cookies里面
保存到cookie数据库里面:
执行相对应的方法:setitem,getitem,delitem,clear等,cookie_dic['session_id'][key]=value
具体图解:
{
session_id(不同随机字符串,加密处理的):{user:'yunxin','xx':'xxxx'},
session_id(不同随机字符串,加密处理的):{user:'xiaoha','xx':'xxxx'},
session_id(不同随机字符串,加密处理的):{user:'xiaoyun','xx':'xxxx'},
session_id(不同随机字符串,加密处理的):{user:'xaiowu','xx':'xxxx'},
session_id(不同随机字符串,加密处理的):{user:'xiaoli','xx':'xxxx'},
}

第二种情况:可以设置缓存,比如redis,或者是memcache等,保存起来

'''requets里面封装了cookie,还有session,requets.session,requets[session]requets.set_cookie('sessioin_id','xxxxxxx',expire=60秒*多少)requets.get_cookie('session_id')'''
import  tornado.webimport  redis##可以保存进redis里面就进行缓存class Cache():    def   __init__(self):        self.container={}#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>缓存问题        # redis.Redis(host=)    def   __contains__(self, item):###传过来的item是coookied_id,判断这个用户是否存在,如果存在的话,就返回true,到下面就是false        #判断        if   item  in  self.container:            return     True        else:            return   False

    def  get(self,cookie_id,key):        print('拿到cooie数据库里面的值:',self.container)        print('get里面的方法',key)        return  self.container[cookie_id][key]

    def  set(self,cookie_id,key,value):        self.container[cookie_id]={}        self.container[cookie_id][key]=value        print('设置cookie成功',self.container)    def   delete(self,cookie_id,key):        del   self.container[cookie_id][key]    def  clear(self,cookie_id):        '''        清除整个用户的cookies记录        :return:        '''        del   self.container[cookie_id]

    def open(self,cookie_id):##cookies_di就是session_id,随机字符串        self.container[cookie_id]={}

class   Session():    def  __init__(self,handler):##handler是传过来的self参数        self.user_id=None        self.handler=handler###这个handler是传过来的requetys对象,注明一下,这个handler是request对象        self.start_base=Cache()        self.db=Cache()##拿到数据库

        ##接受到传过来的参数        recv_user_id=self.handler.get_cookie('session_id')#去当前的requets对象里面拿到这个session_id        print('查看是否存在这个session_id',recv_user_id)        #进行判断看是否是存在着的用户,非法的用户        if  not  recv_user_id :            ##不存在的话,就是新用户            self.user_id=self.create_random_str()            self[self.user_id]={}        else:            ##判断是否是非法的用户,存在user_id,单数不在cookies_dic里面可以找的得到            if recv_user_id    in self.start_base:                print('正常')                print('查看是否存在这个session_id', recv_user_id)                self.user_id = self.create_random_str()            else:                print('非法用户')                self.user_id = self.create_random_str()                # cookies_dic[self.user_id]={}                self.start_base.open(self.user_id)  ##设置cookies值,存入数据库里面                # if  self.start.initie(self.user_id)  in         ############将cookies保存进creqeust.ccokies里面        import  time        ctime=time.time()        self.handler.set_cookie('session_id',self.user_id,expires=ctime+1800)#设置cookies,设置进request里面        ##设置时间为30乘以60秒,就是30分钟        print('*'*100)

    def    create_random_str(self):        import   hashlib        m=hashlib.md5()

        m.update(bytes(str(self.user_id),encoding='utf-8'))

        return   m.hexdigest()

    def  __setitem__(self, key, value):####这个self是login的方法,谁调用了他就是谁        ##注意一下,这个handler是reqeuts对象,对cookie_dic进行设置        print('进行设置setitem')        print('这个key是',key)        print('value',value)

        # cookies_dic[self.user_id][key]=value######self是谁访问的        self.start_base.set(self.user_id,key,value)##self.user_id就是session_id,保存进来        '''        {随机字符串:{        key:value,}        随机字符串:{        key:value, key:value, key:value}        '''

    def __getitem__(self, key):        # return   cookies_dic[self.user_id][key]        return   self.start_base.get(self.user_id,key)

    def  __delitem__(self, key):        self.start_base.delete(self.user_id,key)    def   clear(self):        self.start_base.clear(self.user_id)

class   FOO():    def   initialize(self):##initialize这个自动执行        print('执行FOO函数')        self.session=Session(self)##传入参数进去,看是谁访问的,进行了一步封装,将session封装到了self,就是Session函数里面        # super(FOO,self).initialize()

class   HomeHandler(FOO,tornado.web.RequestHandler):#####先执行父类的方法    def  get(self, *args, **kwargs):        print('看一下,这个self是',self.session)        print(self.session['user'])        if   self.session['user']:            print('进入到home页面')            self.write('home')        else:            self.write('没有用户登录,请去登录')

class   Login(FOO,tornado.web.RequestHandler):    def  get(self, *args, **kwargs):        self.session['user']='yunxin'##当进行这个操作的时候,会进行setitem操作,key和vakue,是在这里进行设置的setitem方法        self.session['status']='is_true'        print('原来的self是',self.session)        self.redirect('/home')

import   tornado.ioloop

application=tornado.web.Application([    (r'/login',Login),    (r'/home', HomeHandler),])

application.listen(8000)tornado.ioloop.IOLoop.instance().start()

'''最开始设置的是session_id,保存进request.session字典里面之后判断是否存在这个session_id,在cookies里面进行判断,self.handler.get_cookie('session_id')如果不存在的话,就是新用户>>self.handler[session_id]={}否则的话就进行判断是否是正常的用户如果是非法的话,就进行重新设置cookie_id(也就是传过来的session_id),self.handler[session_id]={}如果是正常的话,就进行往下面执行>>不用设置self.handler.set_cookie['session_id','xxxx',expire=60秒*多少)

最后设置session_id到cookie数据库里面,self.handler[session_id][key]=value,执行对应的setitem,delitem等方法'''

结果:

D:\conda\python.exe D:/pycharm源代码/Tonardo/session/自写session.py
执行FOO函数
查看是否存在这个session_id None
进行设置setitem
这个key是 6adf97f83acf6453d4a6a4b1070f3754
value {}
设置cookie成功 {'6adf97f83acf6453d4a6a4b1070f3754': {'6adf97f83acf6453d4a6a4b1070f3754': {}}}
****************************************************************************************************
进行设置setitem
这个key是 user
value yunxin
设置cookie成功 {'6adf97f83acf6453d4a6a4b1070f3754': {'user': 'yunxin'}}
进行设置setitem
这个key是 status
value is_true
设置cookie成功 {'6adf97f83acf6453d4a6a4b1070f3754': {'status': 'is_true'}}
原来的self是 <__main__.Session object at 0x00000266B61C53C8>
执行FOO函数
查看是否存在这个session_id 6adf97f83acf6453d4a6a4b1070f3754
非法用户
****************************************************************************************************
看一下,这个self是 <__main__.Session object at 0x00000266B61C56A0>
拿到cooie数据库里面的值: {'6adf97f83acf6453d4a6a4b1070f3754': {}}
get里面的方法 user

转载于:https://www.cnblogs.com/yunxintryyoubest/p/10014935.html

自定义session,cookie相关推荐

  1. java sessionstate_在Java Web开发中自定义Session

    Session在存储安全性要求较高的会话信息方面是必不可少的,对于分布式Web应用自定义Session支持独立的状态服务器或集群是必须的.本文就来教大家如何在Java Web开发中自定义Session ...

  2. Asp.net MVC使用Model Binding解除Session, Cookie等依赖

    上篇文章"Asp.net MVC使用Filter解除Session, Cookie等依赖"介绍了如何使用Filter来解除对于Session, Cookie的依赖. 其实这个也可以 ...

  3. java 重写session_使用Shiro重写Session 自定义SESSION

    引入shiro的jar包 1.2.3 org.apache.shiro shiro-core ${shiroVersion} org.apache.shiro shiro-web ${shiroVer ...

  4. session mysql java_PHP自定义session处理方法,保存到MySQL数据库中

    我们都知道,session是为了解决因特网的无状态属性而创造出来的.我们可以用session这种会话管理机制来构建购物车.监控站点网络访问,甚至还可以跟踪某一个用户具体是如何使用你的应用的.PHP默认 ...

  5. 为tornado自定义session

    cookie和session 在自定义session前,我们需要先了解cookie和session是什么,可以参考我之前的博客:http://blog.csdn.net/ayhan_huang/art ...

  6. Session/Cookie/Token还傻傻分不清?

    Cookie.Session.Token 傻傻分不清 Session/Cookie/Token 还傻傻分不清? 相信项目中用JWT Token的应该不在少数,但是发现网上很多文章对 token 的介绍 ...

  7. session,cookie,sessionStorage,localStorage的区别及应用场景

    浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟服务端进行数据交互. 一.cookie和session cookie和session都是用来跟踪浏览器 ...

  8. php memcache 封装类,PHP 自定义session储存 MEMCACHE 方式类

    自定义session储存 MEMCACHE 方式类 在php.ini配置文件中更改设置 (Registered_save_handlers 有三种方式 files user memcache) ses ...

  9. Mock session,cookie,querystring in ASB.NET MVC

    写测试用例的时候经常发现,所写的功能需要Http上下文的支持(session,cookie)这类的. 以下介绍2种应用场景. 用于控制器内Requet获取参数 控制器内的Requet其实是控制器内的属 ...

  10. PHP 自定义session储存 数据库 方式类   高洛峰 细说PHP

    自定义session储存 数据库 方式类 在php.ini配置文件中更改设置 (Registered_save_handlers 有三种方式 files user memcache) session. ...

最新文章

  1. python飞机大战3关BOSS
  2. JDeveloper中的Java反编译器
  3. 让系统在内存中高速运行
  4. STM32CubeMX使用(七)之通用定时器和系统定时器
  5. iOS图形学(三):屏幕成像原理
  6. 【电子技术基础(精华版)】整流与滤波电路
  7. “Microsoft Internet Explorer”,微软的最后一款IE,以此命名——IE6!
  8. 如何删除微软拼音输入法2003(转)
  9. scipy csc csr到底是什么东西
  10. 各种数据类型的取值范围
  11. 用递归法求两个数的最大公约数
  12. P3488 [POI2009]LYZ-Ice Skates
  13. 阿里云ECS最新的实例规格族有哪些
  14. manjaro go的安装
  15. 小程序兼容各个ios版本
  16. 标志寄存器df_标志寄存器
  17. 中国电信推出量子加密通话;中国建成世界最大量子通信网络|全球量子科技与工业快讯第四期
  18. html实现学生系统,基于HTML5的学生信息管理系统的设计与实现
  19. 一代信仰落幕,凯迪拉克CTS-V已经停产
  20. 数据分析,这样满足运营的需求

热门文章

  1. VirtualBox启动报错
  2. [django]list_display 中包含外键内的字段
  3. Fedora core 2下建立Poptop服务器以及常见问题
  4. pku1067----取石子游戏(博弈)
  5. datagrip替换字_Datagrip 快捷键和常用插件持续更新一集一些使用技巧
  6. python3九九乘法表儿歌_python3: 简单4步骤输出九九乘法表
  7. css 毛玻璃_css揭秘-视觉效果
  8. php 替换指定标签中的内容,php如何根据不同的条件替换html代码中的img标签
  9. 感恩节专宠有礼,送3本技术好书
  10. Oddz将于3月18日在Polkastarter进行IDO,此前已完成260万美元战略融资