第一种情况:没有设置缓存:执行相对应的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的更多相关文章

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

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

  2. Asp.net 服务器Application,Session,Cookie,ViewState和Cache区别

    2.8 Context 的使用Context 对象包含与当前页面相关的信息,提供对整个上下文的访问,包括请求.响应.以及上文中的Session 和Application 等信息.可以使用此对象在网页之 ...

  3. python_way ,自定义session

    python_way ,自定义session container = {} #可以是数据库,可以是缓存也可以是文件 class Session: def __init__(self, handler) ...

  4. 关于session,cookie,Cache

    昨天看了<ASP.NET 页面之间传值的几种方式>之后,对session,cookie,Cache有了更近一步的了解,以下是相关的内容 一.Session 1.Session基本操作 a. ...

  5. Tronado自定义Session

    这里就不一一诉说Session和Cookie直接的关系了,下面以一张图来概括: 下面是一个简单的Tornaod自定义Session的例子,看完后你可能会明白为什么我们在Django里可以直接使用req ...

  6. 简单的自定义Session

    有关Session.Cookie机制建议参考文章:CookieSession机制详解,写的很详细,不再赘述 本篇文章通过一个简单的案例揭秘Session机制以及和Cookie的区别和联系: 服务器端代 ...

  7. Python web框架 Tornado(三)自定义session组件

    我们在学习Django框架的过程中,内部封装了session组件,以方便于我们使用进行验证.但是Tornado框架是没有session的,所以如果想使用session的话,就需要我们自己定制相对应的组 ...

  8. 第一篇 Flask基础篇之(配置文件,路由系统,模板,请求响应,session&cookie)

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  9. JSP + Session Cookie详解

    篇幅较大,对JSP进行了非常详细的讲解,并解释了Session和Cookie的实现原理 ,预计看完需要20分钟左右,慢慢享受吧 JSP概述 掌握了servlet后,就可以利用servlet来开发动态页 ...

  10. Flask(六)—— 自定义session

    Flask(六)—— 自定义session import uuid import json from flask.sessions import SessionInterface from flask ...

随机推荐

  1. spring拦截器中修改响应消息头

    问题描述 前后端分离的项目,前端使用Vue,后端使用Spring MVC. 显然,需要解决浏览器跨域访问数据限制的问题,在此使用CROS协议解决. 由于该项目我在中期加入的,主要负责集成shiro框架 ...

  2. jsp实现文件上传下载

    文件上传: upload.jsp <form action="uploadServlet" method="post" enctype="mul ...

  3. Basic berkeley socket functions

    gethostbyname() DNS を通して.Domain の Information を GET する.例えば IP Address なんだ. げん型: #include <netdb.h ...

  4. Javaweb学习笔记——(十)——————response对象,response字符流缓冲器,响应头,状态码,重定向,requset对象,路径和乱码

    请求响应对象: request和response *当服务器接收都请求后,服务器会创建request和response对象,把请求数据封装到request对象中: *然后调用Servlet的sevic ...

  5. GCC编译器原理(二)------编译原理一:ELF文件(1)

    二.ELF 文件介绍 2.1 可执行文件格式综述 相对于其它文件类型,可执行文件可能是一个操作系统中最重要的文件类型,因为它们是完成操作的真正执行者.可执行文件的大小.运行速度.资源占用情况以及可扩展 ...

  6. 如何利用iconfont图标代替小图片

    1.首先 你要有一个阿里巴巴矢量图这个网站的账号:http://www.iconfont.cn/ 在这里注册哦~ 2.蓝后 可以在首页搜索你想要的图标,比如 我想放一个管理员的图标在页面上: 就要点击 ...

  7. 【noip 2011】提高组Day1T3.Mayan游戏

    Description Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是 ...

  8. Web获取客户端物理MAC地址(ocx插件)ActiveX控件

    主要是通过ActiveX控件 从本地获取到MAC地址,传入到浏览器打开的网页中,再提交到服务器. 具体详解与步骤看文档中: 文件实例包下载 DotNetFX 文件夹附件文件:(可能安装时需用) dot ...

  9. linux 删除占用文件

    清空 程序占用日志文件: cat /dev/null > log 或: echo " " > log 直接删除程序占用文件大小不生效: rm -rf log ps -e ...

  10. 关于ajax及相关数据传输问题

    之前整理的ajax相关应用笔记,一直没有时间整理,今天突然翻到特此将初稿大概的整理了一下,可能有点乱,欢迎指出不足之处. jQuery的ajax请求:complete函数一般无论服务器有无数据返回都会 ...