def __init__(self, session_secret, session_timeout, session_path = None, session_id_key = 'SESSION_ID', session_verify_key = 'VERIFICATION'): self.session_secret = session_secret self.session_timeout = session_timeout self.session_id_key = session_id_key self.session_verify_key = session_verify_key import tempfile session_path = session_path or tempfile.gettempdir() if not os.path.isdir(session_path): raise SessionPathNotExists('session path not exist') self.session_path = session_path self.SESSION_PREFIX = '_glab_sess_' from gale.utils import ShareDict self.__file_map = ShareDict() # 文件的访问时间记录到一张hash表中去 self.__made_file_map(self.__file_map)
class FileSessionManager(ISessionManager): """这是使用文件来实现的seession机制""" lock = threading.RLock() def __init__(self, session_secret, session_timeout, session_path = None, session_id_key = 'SESSION_ID', session_verify_key = 'VERIFICATION'): self.session_secret = session_secret self.session_timeout = session_timeout self.session_id_key = session_id_key self.session_verify_key = session_verify_key import tempfile session_path = session_path or tempfile.gettempdir() if not os.path.isdir(session_path): raise SessionPathNotExists('session path not exist') self.session_path = session_path self.SESSION_PREFIX = '_glab_sess_' from gale.utils import ShareDict self.__file_map = ShareDict() # 文件的访问时间记录到一张hash表中去 self.__made_file_map(self.__file_map) def __made_file_map(self, file_map): import glob for session_file in glob.glob(os.path.join(self.session_path, self.SESSION_PREFIX) + '*'): _stat = os.stat(session_file) if time.time() > _stat.st_atime + self.session_timeout: os.remove(session_file) else: file_map[session_file] = _stat.st_atime def __update_file_map(self, session_file): for session_file, session_atime in self.__file_map.items(): if time.time() > session_atime + self.session_timeout: os.remove(session_file) del self.__file_map[session_file] self.__file_map[session_file] = time.time() # 把刚访问的那个文件在表中的访问日期也更新掉 def _fetch(self, session_id): session_file = os.path.join(self.session_path, '%s%s' % (self.SESSION_PREFIX, session_id)) self.__update_file_map(session_file) # 每次有访问信息进来的,就去检查下hash表 try: with open(session_file, 'rb') as session_fd: session_data = json.loads(session_fd.read()) except IOError: return {} return isinstance(session_data, dict) and session_data or {} def save_session(self, session): session_file = os.path.join(self.session_path, '%s%s' % (self.SESSION_PREFIX, session.session_id)) session_data = json.dumps(dict(session.items())) with self.lock: with open(session_file, 'wb') as session_fd: session_fd.write(session_data) def remove_session(self, session): session_file = os.path.join(self.session_path, '%s%s' % (self.SESSION_PREFIX, session.session_id)) del session if os.path.exists(session_file): os.remove(session_file)