【Python】Django页面渲染函数的一个小缺陷

总结

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

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

    缘由

    对传给render_to_string()函数的字典参数值中,包含了被filter函数过滤后的值,被渲染后,出现了信息缺失

    详细

    过滤器相关代码


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)

原文地址:http://blog.51cto.com/l0vesql/2327786

时间: 2024-07-31 03:19:21

【Python】Django页面渲染函数的一个小缺陷的相关文章

关于sniff函数的一个小坑

最近在用scapy模块写一个关于WiFi的脚本时用到sniff函数,其中遇到了一个小坑,记录如下: sniff函数是在指定网卡上每次嗅探到一个数据包后然后将它传给prn指定的函数. 原文地址:https://www.cnblogs.com/erfze/p/10090910.html

linux中fork函数的一个小思考

1.fork函数 头文件: #include<unistd.h> 函数原型: pid_t fork( void);(pid_t 是一个宏定义,其实质是int 被定义在#include<sys/types.h>中) 返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID:否则,出错返回-1 函数说明: 一个现有进程可以调用fork函数创建一个新进程.由fork创建的新进程被称为子进程(child process).fork函数被调用一次但返回两次.两次返回的唯一区别

python用类装饰函数的一个有趣实现

class RunningLog: def __init__(self,func): self._func=func self._func_name = func.__name__ def __call__(self,func_name,level=None): self.level=level value=getattr(self, func_name.__str__())() self._func(func_name,self.level) return 'result: '+value d

python django 业务树形结构规划及页面渲染

概述: 在项目中,父级到子级结构并不少见,如果仅仅的两层树形结构,我们可以使用数据库的外键设计轻松做到,子级业务表设计一字段外键到父级业务表,这样子到父.父到子的查询都非常简单. 但是往往父子结构会有一级二级三级等等多层规划,因为子结构的层数是不定的,子可以有子,再子:这样的树形下去,外键设计就不可行了. 项目说明 设计一个 业务 树形结构规划,多层灵活型结构, 从 建表设计 到  浏览器前端展示 整体的结构规划 使用 python django web框架:和一个js 树形结构插件treevi

制作一个小黄鸭转圈跳舞的页面。

我们来制作一个小黄鸭转圈跳舞的页面. 分析一下 1.分析一下这个页面,要完成这些效果,一共需要3步: 把鸭子都放到一个盒子当中 在盒子里,把每个鸭子的位置摆好 让盒子旋转 2.让鸭子在盒子中的位置摆好,需要怎么做: 先让鸭子站在圆心的位置(需要先了解父相子绝定位方式) 沿一个方向移动一个半径的距离(3d) 每个鸭子旋转一个角度,让鸭子均匀的分布一圈 开始写代码 要用到的知识包括几个HTML标签和一部分的css知识. 先把图片放到页面里边. 先来在页面中添加一个img标签,将小黄鸭跳舞的gif图放

Django之视图函数总结

Django之视图函数总结 HttpRequest与HttpResponse http请求中产生两个核心对象: HttpRequest对象:用户请求相关的所有信息(对象) HttpResponse对象:响应字符串 HttpRequest对象的属性和方法: request.path # 获取访问文件路径 request.method #获取请求中使用的HTTP方式(POST/GET) request.body #含所有请求体信息 是bytes类型 request.GET #GET请求的数据(类字典

一个小效果引出的兼容性探讨

最近在做个小效果,没想到引出了几个以前的没认真去自己探讨的兼容问题,最后虽然这个效果还是不是很满意,但在这里想分享一下过程 首先想做的效果是 每次点击页面时,出现一个小波纹,然后自动消失 可以先看一下demo 到最后实现后,发现这个效果实用性不是很高,但是过程引出了一些值得积累的问题 引出知识点: transition的兼容支持 事件兼容 transitionend的兼容 如果我out了,请点击关闭 首先看一下 transition 的兼容性 1 <span style="font-siz

python django查询12306火车票

逢年过节,想坐个高铁票,都得上12306去买票,但用过的都会发现,它会把临近站点的也筛出来了.但有时我们压根就不会考虑买到临近站点的. 另一方面,在购票高峰期,有可能你要的出发站到目的站都没有票了,这时一般我们会往前面的站买票,或者往后面的站买票,这个你就得一次次查前后都有什么站,再一步步复制去搜索有什么票,因为它会把临近站的查出来,所以你提前站的车次有可能压根就不经过你要去的目的站.还得再查多几次. 基于此,自己就想着让程序来帮忙做这件事.花了些时间,用python django框架,写了一个

使用django+mysql+scrapy制作的一个小说网站

小说网站用的程序都是千篇一律的,jieqi + guanguang,无聊时间学习python+django,也做了一个小说网站,下面说一说做这个网站一些过程, 制作这种采集站,最要紧的是要有一个好的采集器,在python的世界里面,爬取网页真是小菜一碟,urllib urllib2 requests 都是神器,不过为了追求程序的稳定性和易用性,我采用了scrapy这个第三方采集库 在windows下安装这个采集库有点麻烦,给大家推荐一个网站 http://www.lfd.uci.edu/~goh