Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session框架
Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session
import tornado.ioloop
import tornado.web
from myhash import ring
create_session_id = 'sasd' # 随机生成的 session 函数
class SessionGen(object):
container = {}
def __init__(self,handler):
self.handler = handler
random_str = self.handler.get_cookie('session_id')
if not random_str:
random_str = create_session_id # 生成session随机字符串
else:
if random_str not in self.container: # 伪造的session随机字符串
random_str = create_session_id
self.container[random_str]={} # session 字典
self.random_str = random_str
self.handler.set_cookie('session_id',random_str,max_age=10)
def __setitem__(self, key, value):
# 基于redis 分布式 设置 session
# import redis
# result = ring.get_node('ascf') # 获取分布式 分配的 ip端口 ;split
# conn = redis.Redis(host='ip',port=232)
# conn.hset('ascf',key,value)
self.container[self.random_str][key] = value
def __getitem__(self, item):
# 基于redis 分布式 获取 session
# import redis
# result = ring.get_node('ascf') # 获取分布式 分配的 ip端口 ;split
# conn = redis.Redis(host='ip',port=port)
# return conn.hget('ascf',item)
return self.container[self.random_str].get(item)
def __delitem__(self, key):
if self.container[self.random_str].get(key):
del self.container[self.random_str][key]
# 基于redis 分布式 删除 session
# import redis
# ip,port = ring.get_node('ascf').split(':') # 获取分布式 分配的 ip端口 ;split
# conn = redis.Redis(host='ip',port=232)
# conn.hdel('ascf',key)
class LoginHandler(tornado.web.RequestHandler):
def initialize(self):
self.session = SessionGen(self)
def get(self):
self.render('login.html',msg='') # 渲染template
def post(self):
username = self.get_argument('username')
pwd = self.get_argument('pwd')
if username == 'root' and pwd == '123':
self.set_cookie('user',username)
self.session['user'] = username
self.redirect('/index')
return
self.render('login.html',**{'msg':'用户密码有误'})
class IndexHandler(tornado.web.RequestHandler):
def initialize(self):
self.session = SessionGen(self)
def get(self):
if self.session['user']:
self.write('ojbk')
settings = {
'template_path':'templates',
'static_path':'static',
'static_url_prefix':'/static/', # 静态文件 url
# 'xsrf_cookies':True, # csrf
}
# 配置模板文件路径
application = tornado.web.Application([
(r"/login",LoginHandler),
(r"/index",IndexHandler),
],**settings # 配置文件
)
if __name__ == '__main__':
# 创建socket对象
application.listen(8000)
# conn,add = socket.accept()
tornado.ioloop.IOLoop.instance().start()
Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session框架的更多相关文章
- 从零到一手写基于Redis的分布式锁框架
1.分布式锁缘由 学习编程初期,我们做的诸如教务系统.成绩管理系统大多是单机架构,单机架构在处理并发的问题上一般是依赖于JDK内置的并发编程类库,如synchronize关键字.Lock类等.随着业务 ...
- 基于redis实现分布式Session
学习到好的知识还是需要记录下来的. 开发环境 asp.net mvc4,iis.asp.net 自带的session机制存在诸多不好的地方.先只要列出几点. asp.net mvc 默认的sessio ...
- 基于ZooKeeper的分布式Session实现(转)
1. 认识ZooKeeper ZooKeeper—— “动物园管理员”.动物园里当然有好多的动物,游客可以根据动物园提供的向导图到不同的场馆观赏各种类型的动物,而不是像走在原始丛林里,心惊胆颤的被 ...
- 基于ZooKeeper的分布式Session实现
1. 认识ZooKeeper ZooKeeper—— “动物园管理员”.动物园里当然有好多的动物,游客可以根据动物园提供的向导图到不同的场馆观赏各种类型的动物,而不是像走在原始丛林里,心惊胆颤的被 ...
- Java Web学习总结(20)——基于ZooKeeper的分布式session实现
1. 认识ZooKeeper ZooKeeper-- "动物园管理员".动物园里当然有好多的动物,游客可以根据动物园提供的向导图到不同的场馆观赏各种类型的动物,而不是像走在原始 ...
- 基于redis的处理session的方法
一个基于redis的处理session的方法,如下. <?php class Session_custom { private $redis; // redis实例 private $prefi ...
- 基于Redis缓存的Session共享(附源码)
基于Redis缓存的Session共享(附源码) 在上一篇文章中我们研究了Redis的安装及一些基本的缓存操作,今天我们就利用Redis缓存实现一个Session共享,基于.NET平台的Seesion ...
- 基于Dubbo的分布式事务框架(LCN)
原文地址:http://原文地址:https://github.com/1991wangliang/transaction 基于Dubbo的分布式事务框架(LCN) 该框架依赖Redis/dubbo/ ...
- Spring+Shiro搭建基于Redis的分布式权限系统(有实例)
摘要: 简单介绍使用Spring+Shiro搭建基于Redis的分布式权限系统. 这篇主要介绍Shiro如何与redis结合搭建分布式权限系统,至于如何使用和配置Shiro就不多说了.完整实例下载地址 ...
随机推荐
- GRUB2 分析 (一)
GRUB是目前较流行启动引导程序.其第二版被主流Linux发行版所包括.本文将探索和分析GRUB的设计和实现机制. boot.S是第一个研究对象,因为boot.S将被编译成boot.img(512字节 ...
- ViewResolver和ResponseBody笔记
处理HttpResponseBody有两种方式,ViewResolver(视图解析器)和ResponseBody ViewResolver.View多用于jsp,ViewResolver的主要作用是把 ...
- 20145328 《Java程序设计》第5周学习总结
20145328 <Java程序设计>第5周学习总结 教材学习内容总结 语法和继承架构 异常处理关键字 第八章内容主要是对Java的异常处理 Java的异常处理是通过5个关键字来实现的:t ...
- # PHP学习笔记之一
PHP学习笔记之一 标签(空格分隔): PHP 资料来源:慕课网PHP入门篇.PHP学习手册 一.变量 变量定义 $变量名 = 变量值; $var = "xxx"; 变量类型查看 ...
- 怎样让.bat文件直接运行不需要右键管理员权限
:: BatchGotAdmin :------------------------------------- REM --> Check for permissions >nul 2&g ...
- [BZOJ1217]消防局的设立
Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来 连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成 ...
- springBoot的文件上传功能
知识点: 后台:将上传的图片写入指定服务器路径,保存起来,返回上传后的图片路径(在springBoot中,参考博客:http://blog.csdn.net/change_on/article/det ...
- Feign PathVariable annotation was empty on param 0.
使用Feign的时候,如果参数中带有 @PathVariable形式的参数,则要用value=""标明对应的参数,否则会抛出IllegalStateException异常 如 @P ...
- jquery实现全选/全不选
//设置全选全不选$("#checkAll").click(function () { if ($("#checkAll").attr("checke ...
- e.target和e.currentTarget区别
直接上代码: body里: <div id="father"> father <div id="son"> son </div&g ...