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()
相關文章
相關標籤/搜索