自定义session,cookie
第一种情况:没有设置缓存:执行相对应的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相关推荐
- java sessionstate_在Java Web开发中自定义Session
Session在存储安全性要求较高的会话信息方面是必不可少的,对于分布式Web应用自定义Session支持独立的状态服务器或集群是必须的.本文就来教大家如何在Java Web开发中自定义Session ...
- Asp.net MVC使用Model Binding解除Session, Cookie等依赖
上篇文章"Asp.net MVC使用Filter解除Session, Cookie等依赖"介绍了如何使用Filter来解除对于Session, Cookie的依赖. 其实这个也可以 ...
- java 重写session_使用Shiro重写Session 自定义SESSION
引入shiro的jar包 1.2.3 org.apache.shiro shiro-core ${shiroVersion} org.apache.shiro shiro-web ${shiroVer ...
- session mysql java_PHP自定义session处理方法,保存到MySQL数据库中
我们都知道,session是为了解决因特网的无状态属性而创造出来的.我们可以用session这种会话管理机制来构建购物车.监控站点网络访问,甚至还可以跟踪某一个用户具体是如何使用你的应用的.PHP默认 ...
- 为tornado自定义session
cookie和session 在自定义session前,我们需要先了解cookie和session是什么,可以参考我之前的博客:http://blog.csdn.net/ayhan_huang/art ...
- Session/Cookie/Token还傻傻分不清?
Cookie.Session.Token 傻傻分不清 Session/Cookie/Token 还傻傻分不清? 相信项目中用JWT Token的应该不在少数,但是发现网上很多文章对 token 的介绍 ...
- session,cookie,sessionStorage,localStorage的区别及应用场景
浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟服务端进行数据交互. 一.cookie和session cookie和session都是用来跟踪浏览器 ...
- php memcache 封装类,PHP 自定义session储存 MEMCACHE 方式类
自定义session储存 MEMCACHE 方式类 在php.ini配置文件中更改设置 (Registered_save_handlers 有三种方式 files user memcache) ses ...
- Mock session,cookie,querystring in ASB.NET MVC
写测试用例的时候经常发现,所写的功能需要Http上下文的支持(session,cookie)这类的. 以下介绍2种应用场景. 用于控制器内Requet获取参数 控制器内的Requet其实是控制器内的属 ...
- PHP 自定义session储存 数据库 方式类 高洛峰 细说PHP
自定义session储存 数据库 方式类 在php.ini配置文件中更改设置 (Registered_save_handlers 有三种方式 files user memcache) session. ...
最新文章
- python飞机大战3关BOSS
- JDeveloper中的Java反编译器
- 让系统在内存中高速运行
- STM32CubeMX使用(七)之通用定时器和系统定时器
- iOS图形学(三):屏幕成像原理
- 【电子技术基础(精华版)】整流与滤波电路
- “Microsoft Internet Explorer”,微软的最后一款IE,以此命名——IE6!
- 如何删除微软拼音输入法2003(转)
- scipy csc csr到底是什么东西
- 各种数据类型的取值范围
- 用递归法求两个数的最大公约数
- P3488 [POI2009]LYZ-Ice Skates
- 阿里云ECS最新的实例规格族有哪些
- manjaro go的安装
- 小程序兼容各个ios版本
- 标志寄存器df_标志寄存器
- 中国电信推出量子加密通话;中国建成世界最大量子通信网络|全球量子科技与工业快讯第四期
- html实现学生系统,基于HTML5的学生信息管理系统的设计与实现
- 一代信仰落幕,凯迪拉克CTS-V已经停产
- 数据分析,这样满足运营的需求
热门文章
- VirtualBox启动报错
- [django]list_display 中包含外键内的字段
- Fedora core 2下建立Poptop服务器以及常见问题
- pku1067----取石子游戏(博弈)
- datagrip替换字_Datagrip 快捷键和常用插件持续更新一集一些使用技巧
- python3九九乘法表儿歌_python3: 简单4步骤输出九九乘法表
- css 毛玻璃_css揭秘-视觉效果
- php 替换指定标签中的内容,php如何根据不同的条件替换html代码中的img标签
- 感恩节专宠有礼,送3本技术好书
- Oddz将于3月18日在Polkastarter进行IDO,此前已完成260万美元战略融资