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()