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