自定义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.web
import 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
自定义session,cookie的更多相关文章
- Asp.net MVC使用Model Binding解除Session, Cookie等依赖
上篇文章"Asp.net MVC使用Filter解除Session, Cookie等依赖"介绍了如何使用Filter来解除对于Session, Cookie的依赖.其实这个也可以通 ...
- Asp.net 服务器Application,Session,Cookie,ViewState和Cache区别
2.8 Context 的使用Context 对象包含与当前页面相关的信息,提供对整个上下文的访问,包括请求.响应.以及上文中的Session 和Application 等信息.可以使用此对象在网页之 ...
- python_way ,自定义session
python_way ,自定义session container = {} #可以是数据库,可以是缓存也可以是文件 class Session: def __init__(self, handler) ...
- 关于session,cookie,Cache
昨天看了<ASP.NET 页面之间传值的几种方式>之后,对session,cookie,Cache有了更近一步的了解,以下是相关的内容 一.Session 1.Session基本操作 a. ...
- Tronado自定义Session
这里就不一一诉说Session和Cookie直接的关系了,下面以一张图来概括: 下面是一个简单的Tornaod自定义Session的例子,看完后你可能会明白为什么我们在Django里可以直接使用req ...
- 简单的自定义Session
有关Session.Cookie机制建议参考文章:CookieSession机制详解,写的很详细,不再赘述 本篇文章通过一个简单的案例揭秘Session机制以及和Cookie的区别和联系: 服务器端代 ...
- Python web框架 Tornado(三)自定义session组件
我们在学习Django框架的过程中,内部封装了session组件,以方便于我们使用进行验证.但是Tornado框架是没有session的,所以如果想使用session的话,就需要我们自己定制相对应的组 ...
- 第一篇 Flask基础篇之(配置文件,路由系统,模板,请求响应,session&cookie)
Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...
- JSP + Session Cookie详解
篇幅较大,对JSP进行了非常详细的讲解,并解释了Session和Cookie的实现原理 ,预计看完需要20分钟左右,慢慢享受吧 JSP概述 掌握了servlet后,就可以利用servlet来开发动态页 ...
- Flask(六)—— 自定义session
Flask(六)—— 自定义session import uuid import json from flask.sessions import SessionInterface from flask ...
随机推荐
- spring拦截器中修改响应消息头
问题描述 前后端分离的项目,前端使用Vue,后端使用Spring MVC. 显然,需要解决浏览器跨域访问数据限制的问题,在此使用CROS协议解决. 由于该项目我在中期加入的,主要负责集成shiro框架 ...
- jsp实现文件上传下载
文件上传: upload.jsp <form action="uploadServlet" method="post" enctype="mul ...
- Basic berkeley socket functions
gethostbyname() DNS を通して.Domain の Information を GET する.例えば IP Address なんだ. げん型: #include <netdb.h ...
- Javaweb学习笔记——(十)——————response对象,response字符流缓冲器,响应头,状态码,重定向,requset对象,路径和乱码
请求响应对象: request和response *当服务器接收都请求后,服务器会创建request和response对象,把请求数据封装到request对象中: *然后调用Servlet的sevic ...
- GCC编译器原理(二)------编译原理一:ELF文件(1)
二.ELF 文件介绍 2.1 可执行文件格式综述 相对于其它文件类型,可执行文件可能是一个操作系统中最重要的文件类型,因为它们是完成操作的真正执行者.可执行文件的大小.运行速度.资源占用情况以及可扩展 ...
- 如何利用iconfont图标代替小图片
1.首先 你要有一个阿里巴巴矢量图这个网站的账号:http://www.iconfont.cn/ 在这里注册哦~ 2.蓝后 可以在首页搜索你想要的图标,比如 我想放一个管理员的图标在页面上: 就要点击 ...
- 【noip 2011】提高组Day1T3.Mayan游戏
Description Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是 ...
- Web获取客户端物理MAC地址(ocx插件)ActiveX控件
主要是通过ActiveX控件 从本地获取到MAC地址,传入到浏览器打开的网页中,再提交到服务器. 具体详解与步骤看文档中: 文件实例包下载 DotNetFX 文件夹附件文件:(可能安装时需用) dot ...
- linux 删除占用文件
清空 程序占用日志文件: cat /dev/null > log 或: echo " " > log 直接删除程序占用文件大小不生效: rm -rf log ps -e ...
- 关于ajax及相关数据传输问题
之前整理的ajax相关应用笔记,一直没有时间整理,今天突然翻到特此将初稿大概的整理了一下,可能有点乱,欢迎指出不足之处. jQuery的ajax请求:complete函数一般无论服务器有无数据返回都会 ...