python---redis實現自定義session
阿新 • • 發佈:2018-03-20
ssm clas ges enc set hash blog dig 註意
SESSION_EXPIRE = 60
SESSION_TYPE = ‘Redis‘
pool = redis.ConnectionPool(host="localhost",port=6379) redi_conn = redis.Redis(connection_pool=pool) class BaseSession: @classmethod def get_session_handler(cls,handler): if config.SESSION_TYPE == "Memery": obj = MemerySession(handler) elif config.SESSION_TYPE== "Mamcache": obj = MemcacheSession(handler) elif config.SESSION_TYPE == "Redis": obj = RedisSession(handler) return obj class RedisSession: session_id = "py_session" def __init__(self,handler): self.handler = handler #從客戶端獲取隨機字符串 client_random_str= self.handler.get_cookie(MemcacheSession.session_id) #如果獲取到了字符串 if client_random_str and redi_conn.exists(client_random_str): self.random_str = client_random_str else: self.random_str = self.__genarate_random_str() redi_conn.hset(self.random_str,None,None) redi_conn.expire(self.random_str,config.SESSION_EXPIRE) expires_time= time.time() + config.SESSION_EXPIRE handler.set_cookie(MemerySession.prex_str, self.random_str, expires=expires_time) def __setitem__(self, key, value): redi_conn.hget(self.random_str,key) redi_conn.hset(self.random_str, key,value) redi_conn.expire(self.random_str, config.SESSION_EXPIRE) def __getitem__(self, item): ret = redi_conn.hget(self.random_str,item) return ret def __delitem__(self, key): redi_conn.hdel(self.random_str,key) redi_conn.expire(self.random_str, config.SESSION_EXPIRE) def __genarate_random_str(self): obj = hashlib.md5() obj.update(bytes(str(time.time()),encoding="utf8")) random_str=obj.hexdigest() return random_str
註意:
1.redis中獲取數據類型為bytes,在進行比較,例如驗證碼比較時,需要進行類型轉換
if str(self.session[‘code‘].lower(),encoding="utf8") != self.get_argument(‘code‘).lower(): status[‘status‘] = False status[‘error‘] = "驗證碼錯誤"
或者將接受的數據轉換為bytes類型
2.存放數據如果為其他類型
需要在使用時使用eval執行,是原來字符串轉為數據類型
python---redis實現自定義session