第一种情况:没有设置缓存:执行相对应的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. C语言 - 栈和单链表的实现

    单链表:linkList.h linkList.c #ifndef LINKLIST_H_INCLUDE #define LINKLIST_H_INCLUDE #include <Windows ...

  2. C#调用C++导出类的一个实例

    一直认为带导出类dll的只有VC自己可以调用,其它编程语言无法调用,今天看到一篇文章才知道自己错了.https://blog.csdn.net/huiyouyongdeyu2011/article/d ...

  3. CorelDrawX8安装时提示已安装另一个版本

    (1)首先卸载VIsualC++ 2015 运行库. (2)如果有VisualC++ 2017运行库,卸载VisualC++2017运行库,即可.

  4. 三十九、Linux 线程——线程的同步和互斥

    39.1 概念 线程同步 是一个宏观概念,在微观上包含线程的相互排斥和线程先后执行的约束问题 解决同步方式 条件变量 线程信号量 线程互斥 线程执行的相互排斥 解决互斥的方式 互斥锁 读写锁 线程信号 ...

  5. python 之模块random

    随机形成字母和数字组成的五位字符码. [root@localhost python]# vim timee.py import random def coder(): code = '' for i ...

  6. Kaldi中的L2正则化

    steps/nnet3/train_dnn.py --l2-regularize-factor 影响模型参数的l2正则化强度的因子.要进行l2正则化,主要方法是在配置文件中使用'l2-regulari ...

  7. python之接口开发基础知识

    一.开发接口的作用 1.mock 服务:在别的接口没有开发完成的时候可以模拟一些接口以便测试已经开发完成的接口,例如假的支付接口,模拟支付成功.支付失败. 2.了解接口是如何实现的:数据交互.数据返回 ...

  8. yum 记一次安装时的报错

    我电脑是centos 6.8,我先安装了openslp-2.0.0-3.el6.x86_64.rpm 然后我更改了yum源配置文件,我将updates源给禁用了,只保留os源和extras源,注意了, ...

  9. AngularJS--及其他js框架对比

    ----和 **类似?? Angular 2.谷歌的 React   Facebook的 Vue.js. Ember.js. https://github.com/angular/angular.js ...

  10. 转: hibernate配置文件hibernate.cfg.xml和.hbm.xml的详细解释

    http://blog.csdn.net/yuhui123999/article/details/51886531 hibernate.cfg.xml -标准的XML文件的起始行,version='1 ...