Ejemplo n.º 1
0
 def get_model_for_url(self, key):
     """通过当前页面路由url,获取菜单对应的记录"""
     # 使用md5生成对应的缓存key值
     key_md5 = encrypt_helper.md5(key)
     # 从缓存中提取菜单记录
     model = cache_helper.get(key_md5)
     # 记录不存在时,运行记录载入缓存程序
     if not model:
         self._load_cache()
         model = cache_helper.get(key_md5)
     return model
Ejemplo n.º 2
0
 def del_relevance_cache(self):
     """删除关联缓存————将和数据表记录关联的,个性化缓存全部删除"""
     # 从nosql中读取全局缓存列表
     cache_list = cache_helper.get(self.__cache_list)
     # 清除已删除缓存列表
     cache_helper.delete(self.__cache_list)
     if cache_list:
         # 执行删除操作
         for cache in cache_list:
             cache_helper.delete(cache)
Ejemplo n.º 3
0
def add_operation_times(operation_times_key):
    """
    累加操作次数
    参数:
    operation_times_key 缓存key
    """
    # 获取当前用户已记录操作次数
    get_operation_times = convert_helper.to_int0(
        cache_helper.get(operation_times_key))
    # 记录获取次数
    cache_helper.set(operation_times_key, get_operation_times + 1, 600)
Ejemplo n.º 4
0
 def add_relevance_cache_in_list(self, key):
     """将缓存名称存储到列表里————主要存储与记录变更关联的"""
     # 从nosql中读取全局缓存列表
     cache_list = cache_helper.get(self.__cache_list)
     # 判断缓存列表是否有值,有则进行添加操作
     if cache_list:
         # 判断是否已存储列表中,不存在则执行添加操作
         if not key in cache_list:
             cache_list.append(key)
             cache_helper.set(self.__cache_list, cache_list)
     # 无则直接创建全局缓存列表,并存储到nosql中
     else:
         cache_list = [key]
         cache_helper.set(self.__cache_list, cache_list)
Ejemplo n.º 5
0
 def get_model_for_cache(self, pk):
     """从缓存中读取数据库记录"""
     # 生成缓存key
     key = self.get_cache_key(pk)
     # 从缓存中读取数据库记录
     result = cache_helper.get(key)
     # 缓存中不存在记录,则从数据库获取
     if not result:
         result = self.get_model_for_pk(pk)
         self.set_model_for_cache(pk, result)
     if result:
         return result
     else:
         return {}
Ejemplo n.º 6
0
    def get_model_for_cache_of_where(self, where):
        """
        通过条件获取记录实体——条件必须是额外的主键,也就是说记录是唯一的(我们经常需要使用key、编码或指定条件来获取记录,这时可以通过当前方法来获取)
        :param where: 查询条件
        :return: 记录实体
        """
        # 生成实体缓存key
        model_cache_key = self.__table_name + encrypt_helper.md5(where)
        # 通过条件从缓存中获取记录id
        pk = cache_helper.get(model_cache_key)
        # 如果主键id存在,则直接从缓存中读取记录
        if pk:
            return self.get_model_for_cache(pk)

        # 否则从数据库中获取
        result = self.get_model(where)
        if result:
            # 存储条件对应的主键id值到缓存中
            cache_helper.set(model_cache_key, result.get(self.__pk_name))
            # 存储记录实体到缓存中
            self.set_model_for_cache(result.get(self.__pk_name), result)
            return result
Ejemplo n.º 7
0
def check_operation_times(operation_name, limiting_frequency, ip, is_add=True):
    """
    检查操作次数
    参数:
    operation_name      操作名称
    limiting_frequency  限制次数
    is_add              是否累加
    返回参数:
    True    不限制
    False   限制操作
    """
    if not operation_name or limiting_frequency is None:
        return False, '参数错误,错误码:-400-001,请与管理员联系', '', 0

    # 如果限制次数为0时,默认不限制操作
    if limiting_frequency <= 0:
        return True, '', '', 0

    ##############################################################
    ### 判断用户操作次数,超出次数限制执行 ###
    # 获取当前用户已记录操作次数
    operation_times_key = operation_name + '_' + encrypt_helper.md5(
        operation_name + ip)
    operation_times = convert_helper.to_int0(
        cache_helper.get(operation_times_key))

    # 如果系统限制了出错次数,且当前用户已超出限制,则返回错误
    if limiting_frequency and operation_times >= limiting_frequency:
        return False, '您在10分钟内连续操作次数达到' + str(
            limiting_frequency
        ) + '次,已超出限制,请稍候再试', operation_times_key, operation_times

    if is_add:
        # 记录操作次数,默认在缓存中存储10分钟
        cache_helper.set(operation_times_key, operation_times + 1, 600)

    return True, '', operation_times_key, operation_times
Ejemplo n.º 8
0
    def _load_cache(self):
        """全表记录载入缓存"""
        # 生成缓存载入状态key,主要用于检查是否已执行了菜单表载入缓存判断
        cache_key = self.__table_name + '_is_load'
        # 将自定义的key存储到全局缓存队列中(关于全局缓存队列请查看前面ORM对应章节说明)
        self.add_relevance_cache_in_list(cache_key)
        # 获取缓存载入状态,检查记录是否已载入缓存,是的话则不再执行
        if cache_helper.get(cache_key):
            return
        # 从数据库中读取全部记录
        result = self.get_list()
        # 标记记录已载入缓存
        cache_helper.set(cache_key, True)
        # 如果菜单表没有记录,则直接退出
        if not result:
            return
        # 循环遍历所有记录,组合处理后,存储到nosql缓存中
        for model in result.get('rows', {}):
            # 提取菜单页面对应的接口(后台菜单管理中的接口值,同一个菜单操作时,经常需要访问多个接口,所以这个值有中存储多们接口值)
            interface_url = model.get('interface_url', '')
            if not interface_url:
                continue
            # 获取前端html页面地址
            page_url = model.get('page_url', '')

            # 同一页面接口可能有多个,所以需要进行分割
            interface_url_arr = interface_url.replace('\n', '').replace(
                ' ', '').split(',')
            # 逐个接口处理
            for interface in interface_url_arr:
                # html+接口组合生成key
                url_md5 = encrypt_helper.md5(page_url + interface)
                # 存储到全局缓存队列中,方便菜单记录更改时,自动清除这些自定义缓存
                self.add_relevance_cache_in_list(url_md5)
                # 存储到nosql缓存
                cache_helper.set(url_md5, model)