【Python】Django页面渲染函数的一个小缺陷
admin
2023-07-15 07:02:06
0

总结

python3中 filter() 返回的是可迭代对象,python2中 filter() 返回的是过原列表经过函数过滤后的新列表,也就是把原本Py2中的纯列表转为了更省内存的迭代器

  • 被filter修饰器过滤后的元组对象列表变为可以迭代的filter对象,
  • 渲染器无法识别filter对象,也无法识别把list(iterable_filter)直接带入到参数字典中,需要用表达式转一次

    缘由

    对传给render_to_string()函数的字典参数值中,包含了被filter函数过滤后的值,被渲染后,出现了信息缺失
    【Python】Django页面渲染函数的一个小缺陷

    详细

    过滤器相关代码

def filter_muted_instance_item(format_alerts):
    """屏蔽掉一个实例指定报警项"""
    muted_instance_item = set(
        [(i.ip, i.port, i.item) for i in AlertMute.objects.filter(start_time__lte=datetime.datetime.now(),
                                                                  end_time__gte=datetime.datetime.now())])
    filtered_set = filter(lambda x: (x.ip, x.port, x.item) not in muted_instance_item,  [format_alert for format_alert in format_alerts])
    return filtered_set

# # 定义修饰器 protype
# def host_item_filter(alertor_func):
#     @functools.wraps(alertor_func)
#     def modifier(*args, **kwargs):
#         kwargs['queryset'] = filter_muted_ip(kwargs['queryset'])
#         alertor_func(**kwargs)
#     return modifier

# 定义修饰器,使用wrapt包简化代码
def item_filter(filter_type='instance_item'):
    @wrapt.decorator
    def wrapper(wrapped, instance, args, kwargs):
        if filter_type == 'ip_item':
            kwargs['format_alerts'] = filter_muted_ip(kwargs['format_alerts'])
        elif filter_type == 'instance_item':
            kwargs['format_alerts'] = filter_muted_instance_item(kwargs['format_alerts'])
        return wrapped(*args, **kwargs)

    return wrapper
页面渲染相关代码
@item_filter(filter_type='instance_item')
def mail_alert(alarm_type=None, format_alerts=None, scan_time=datetime.datetime.now(), **kwargs):
    """
    使用预置的邮件模板渲染后发送报警邮件
    :param alarm_type: 报警类型
    :param format_alerts: 警报结果集
    :param scan_time: 警报产生时间
    :param kwargs: 杂项参数
    :return: 无返回项,程序内直接发送邮件
    """
    subject = "报警发送标题"
    template = "报警发送预置HTML模板"
    if alarm_type == 'dbagent_heartbeat':
        template = 'dbAlertAPP/AgentHeartbeatAlarm.html'
        subject = 'dbagent心跳报警'
        elif:
            ...........
        else:
            ..........

    # 这里注意,被filter修饰器过滤后的元组对象列表变为可以迭代的filter对象,也就是把原本Py2中的纯列表转为了更省内存的迭代器
    #         但是渲染器无法识别filter对象,也无法识别把list(iterable_filter)直接带入到参数字典中,需要用表达式转一次
    result_list = list(format_alerts)

    if kwargs.get("check_map"):
        html_string = render_to_string(template, {"results": result_list,
                                                  "scanTime": scan_time,
                                                  "checkMap": kwargs.get("check_map")
                                                  }
                                       )
    else:
        html_string = render_to_string(template, {"results": result_list,
                                                  "scanTime": scan_time,
                                                  }
                                       )

    try:
        send_mail(subject=environment_prefix+subject, message='plain_message', html_message=html_string,
                  from_email=EMAIL_HOST_USER,
                  recipient_list=get_recivers(), fail_silently=False)
    except Exception as e:
        p.error(e)

相关内容

热门资讯

特朗普:正致力于与伊朗达成协议... 特朗普在《纽约邮报》一档播客访谈节目中称,他正与伊朗磋商一项协议,伊朗已同意不再谋求拥有核武器。他表...
不接壤的日菲为何偷划海界? 日菲近日发表联合声明,宣称就“划定两国专属经济区和大陆架的海洋边界”启动正式谈判。两个隔海相望的国家...
凤凰晚报丨从钳工到老戏骨,魏宗... 今日人物【从钳工到老戏骨,魏宗万用一生诠释“戏比天大”】6月1日,表演艺术家魏宗万在上海逝世,享年8...
科威特称伊朗袭击致63人受伤 科威特卫生部门3日称,伊朗当天对科威特的袭击已造成63人受伤,相关部门已启动紧急应对预案,并在全国范...
日本标榜“和平国家”却行扩军备... 今年是东京审判开庭80周年,世界正回望历史、反思战争罪责、捍卫二战后来之不易的国际秩序之际,日本却迈...
浙江杨梅即将大规模上市,如何破... “我们现在的压力很大。”5月底,浙江余姚杨梅产区丈亭镇副镇长林宇站在一片杨梅林前对第一财经表示,当地...
致5死2伤!韩国就韩华航空航天... 【环球网报道 记者 姜蔼玲】据韩联社6月1日报道,针对位于韩国大田的韩华航空航天公司发生爆炸致7人伤...
黄河科技学院2026年招生简章 长按图片识别二维码或点击 “阅读原文” 查看电子招生简章。
医路起航,从“心” 开始!黄河... 6月1日上午,黄河科技学院附属医院2022级临床医学本科实习生入院岗前培训在大医讲堂顺利举办。院领导...
问题居然在实体卡槽上!美版iP... 6月2日消息,日前,又有博主提前把还没发布的iPhone 18 Pro电池参数给曝光了出来,根据爆料...