一、需求
每日发送服务器利用率信息,需要从falcon的接口查询主机cpu.idle信息并处理,生成HTML文件,通过邮箱发送指定负责人。
二、分享代码如下
1、代码段,请原谅我也是刚接触python,仅仅达到可用的程度
h = html()
with h.add(body()).add(div(id='content')):
h1('服务器资源利用率')
with table(border="1",cellspacing="0",style="border-collapse:collapse").add(tbody()):
# 生成报表头部
with tr(align="center",bgcolor="#0080FF",style="color:white"):
td(rowspan="2").add('主机')
td(colspan="4").add('cpu.idle平均使用率')
l = tr(align="center",bgcolor="#0080FF",style="color:white")
l += td('全天')
l += td('18:00-19:00')
l += td('19:00-20:00')
l += td('20:00-21:00')
#for hostname,value in sorted(dic.items(),key=lambda item:item[0]):
# 插入主机信息和监控数据
for hostname,value in dic.items():
l = tr(align="center")
with l:
td(hostname)
td(value[0])
td(value[1])
td(value[2])
td(value[3])
with open('notice.html','a') as f:
f.write(h.render())
2、生成的html文件内容
<html>
<body>
<div id="content">
<h1>服务器资源利用率</h1>
<table border="1" cellspacing="0" style="border-collapse:collapse">
<tbody>
<tr align="center" bgcolor="#0080FF" style="color:white">
<td rowspan="2">主机</td>
<td colspan="4">cpu.idle平均使用率</td>
</tr>
<tr align="center" bgcolor="#0080FF" style="color:white">
<td>全天</td>
<td>18:00-19:00</td>
<td>19:00-20:00</td>
<td>20:00-21:00</td>
</tr>
<tr align="center">
<td>host1</td>
<td>86</td>
<td>85</td>
<td>86</td>
<td>86</td>
</tr>
<tr align="center">
<td>host2</td>
<td>94</td>
<td>93</td>
<td>94</td>
<td>94</td>
</tr>
<tr align="center">
<td>host3</td>
<td>87</td>
<td>86</td>
<td>86</td>
<td>87</td>
</tr>
<tr align="center">
<td>host4</td>
<td>94</td>
<td>94</td>
<td>94</td>
<td>94</td>
</tr>
<tr align="center">
<td>host5</td>
<td>89</td>
<td>88</td>
<td>88</td>
<td>90</td>
</tr>
<tr align="center">
<td>host6</td>
<td>80</td>
<td>78</td>
<td>80</td>
<td>80</td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
3、效果
三、说明
1、生成表头
h = html()
with h.add(body()).add(div(id='content')):
h1('服务器资源利用率')
生成一段正文,也就是上图红框的位置
with table(border="1",cellspacing="0",style="border-collapse:collapse").add(tbody()):
# 生成报表头部
with tr(align="center",bgcolor="#0080FF",style="color:white"):
td(rowspan="2").add('主机')
td(colspan="4").add('cpu.idle平均使用率')
l = tr(align="center",bgcolor="#0080FF",style="color:white")
l += td('全天')
l += td('18:00-19:00')
l += td('19:00-20:00')
l += td('20:00-21:00')
生成一个表格说明的内容,如上图红框位置,由于涉及到行列合并,所以这里使用的是在td格式中添加行列合并的内容
2、分步解析
with table(border="1",cellspacing="0",style="border-collapse:collapse").add(tbody()):
生成table内容,在table内添加tbody内容
with tr(align="center",bgcolor="#0080FF",style="color:white"):
在tr格式内部添加表格内容
<tr>
......
</tr>
生成的html格式如上所示
td(rowspan="2").add('主机')
添加td内容,如果只添加主机,那么直接使用td(‘主机’)即可,但是这里我需要合并两行内容,这里就需要增加rowspan="2"属性,如果需要更多属性,请用,号分割
td(colspan="4").add('cpu.idle平均使用率')
和上面一样,只是需要一个合并四列的单元格,所以需要colspan="4"属性。
<tr align="center" bgcolor="#0080FF" style="color:white">
<td rowspan="2">主机</td>
<td colspan="4">cpu.idle平均使用率</td>
</tr>
这两句生成的html格式和最终效果如图
l = tr(align="center",bgcolor="#0080FF",style="color:white")
l += td('全天')
l += td('18:00-19:00')
l += td('19:00-20:00')
l += td('20:00-21:00')
这行段就是在合并的四列,每列代表什么内容,这里只有tr有属性,分别是居中对齐,背景为蓝色,字体为白色,td无属性
<tr align="center" bgcolor="#0080FF" style="color:white">
<td>全天</td>
<td>18:00-19:00</td>
<td>19:00-20:00</td>
<td>20:00-21:00</td>
</tr>
这段代码生成的html格式和最终效果如图
3、生成表格内容
# 插入主机信息和监控数据
for hostname,value in dic.items():
l = tr(align="center")
with l:
td(hostname)
td(value[0])
td(value[1])
td(value[2])
td(value[3])
这段是通过一个for循环,在每列插入主机和四项监控数据
dic = {'host1':[value1,value2,value3,value4],'host2':[value1,value2,value3,value4]}
原始内容是一个主机对应多个value,dic的格式如上所示
<tr align="center">
<td>host1</td>
<td>86</td>
<td>85</td>
<td>86</td>
<td>86</td>
</tr>
每次循环生成的html内容和效果如上所示
with open('notice.html','a') as f:
f.write(h.render())
这句是将生成的html信息追加到notice.html文件,属性为
a:追加,因为我将主机分组,所以要循环多次生成html文件,不能覆盖上次内容,所以这里使用a
w:写入,每次生成的内容会覆盖原内容
r:只读,读取文件使用
四、调试代码
为了方便调试,也就是每次生成的html文件要验证是否是自己需要的样式,那么可以使用在线工具验证,点我访问
方法很简单,将生成的html文件内容复制到“编辑您的代码”里面,点击提交代码,即可立即生成表格。
参考资料:https://blog.csdn.net/weixin_42028364/article/details/82985193