zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    DELPHI加密字串(异或运算加密)
    delphi 浮点数float转换成十六进制字符串的方法(FloatToHex)
    delphi 浮点数转换成十六进制字符串的方法
    LRC CRC 纵向冗余码校验
    lrc 校验码 ascii 格式
    LRC的效验码的计算方法
    写给嵌入式程序员的循环冗余校验(CRC)算法入门引导
    CRC的校验原理
    CRC校验
    RTU模式与ASCII模式有什么不同
  • 原文地址:https://www.cnblogs.com/big-handsome-guy/p/8654462.html
Copyright © 2011-2022 走看看