自定义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 ...
随机推荐
- node 中 安装 yarn
Yarn是Facebook最近发布的一款依赖包安装工具.Yarn是一个新的快速安全可信赖的可以替代NPM的依赖管理工具 快速安装 //在NPM 中安装npm install -g yarn MacOS ...
- 【一】java 虚拟机 监控示例 Eclipse Memory Analyser
1.堆内存溢出示例代码 import java.util.ArrayList; import java.util.List; public class TestHeap { public static ...
- windows下通过压缩包安装MySQL
一.下载压缩包 二.解压缩后存放在该路径下 三.配置环境变量 将D:\Program Files\mysql-8.0.11-winx64\bin添加到用户PATH变量或系统PATH变量中 ...
- ****** 四十九 ******、软设笔记【UML分析和意义】-建模的意义,UML的特点、结构,用例图
UML UML又称同一建模语言或标准建模语言,是一个支持模型化和软件系统开发的图形化语言,它的作用域不仅支持面向对象的分析与设计,还支持从需求分析开始的软件开发的全过程. 建模的意义: 模型是对现实的 ...
- 初入爬虫(java)
public class CrawlerUtil { public static void main(String [] args) throws IOException { // 创建默认的http ...
- sql leetcode -Duplicate Emails
第一种解法: select distinct p1.Email as Email from Person p1, Person p2 where p1.Email=p2.Email and p1.Id ...
- Andrew NG 机器学习编程作业3 Octave
问题描述:使用逻辑回归(logistic regression)和神经网络(neural networks)识别手写的阿拉伯数字(0-9) 一.逻辑回归实现: 数据加载到octave中,如下图所示: ...
- moment.js 时间戳转换
1. 一段时间以0点为标准 : 2018-03-15 00:00:00- 2018-03-21 00:00:00 let startTime = moment('2018-03-15').format ...
- python,栈的小例子
''' 1.首先确认栈的概念,先进后出 2.初始化的时候如果给了一个数组那么就要将数组进栈 ''' class Stack: def __init__(self,start=[]): self.sta ...
- [CentOS]Failed to start OpenSSH server daemon
问题描述: 以前一直能够通过Xshell来连接服务器,但是突然连接不上了. 解决思路: 首先通过命令查看SSH服务的状态: systemctl status sshd 可以看到,有错误,但是没有显示详 ...