Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session
import tornado.ioloopimport tornado.webfrom myhash import ringcreate_session_id = 'sasd' # 随机生成的 session 函数class SessionGen(object):container = {}def __init__(self,handler):self.handler = handlerrandom_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_idself.container[random_str]={} # session 字典self.random_str = random_strself.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] = valuedef __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='') # 渲染templatedef 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'] = usernameself.redirect('/index')returnself.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()