Beispiel #1
0
    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)
Beispiel #2
0
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)