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