今天的内容是基于 Python + Flask 实现接口接收内存信息 来进一步分享如何使用 Python + Flask 接收 CPU 的信息。


原理:

通过 Python 调用 Shell 脚本去执行 CPU 的相关信息,然后进行处理再请求 Requests 库来向后端定义好的接口来推送数据。


Part1:收集端


1 import os
2 import requests
3 import json
4 import time
5
6 url="http://10.8.31.61:5555/GetCpuResource"
7 cpu_data={}
8 cpu_cmd = [
9 "cat /proc/cpuinfo |grep 'processor' |wc -l",
10 "cat /proc/cpuinfo |grep 'physical id'|sort |uniq |wc -l",
11 "cat /proc/cpuinfo |grep 'cpu cores'|awk -F' ' '{print $4}' |sort |wc -l",
12 "uptime |awk -F':' '{print $5}'"
13 ]
14 def exec_cmd():
15 for cmd in cpu_cmd:
16 print(cmd)
17 response = os.popen(cmd)
18 if("processor" in cmd):
19 cpu_data['logic_cpu']=str(response.read()).replace("\n","")
20 elif("physical" in cmd):
21 cpu_data['physical_cpu']=str(response.read()).replace("\n","")
22 elif("cores" in cmd):
23 cpu_data['cpu_cores']=str(response.read()).replace("\n","")
24 elif("uptime" in cmd):
25 cpu_data['cpu_load'] = str(response.read()).replace("\n", "")
26 if (len(cpu_data['cpu_load']) < 3):
27 response = os.popen("uptime |awk -F':' '{print $4}'")
28 cpu_data['cpu_load'] = str(response.read()).replace("\n", "")
29
30 else:
31 cpu_data['hostname']=str(os.popen("hostname |awk -F'.' '{print $1}' |awk -F'-' '{print $2}'").read()).replace("\n","")
32 response.close()
33
34 def httpPost(datas):
35 header = {"Content-Type":"application/json"}
36 resp_content = requests.post(url=url,data=json.dumps(datas),headers=header)
37 print(resp_content.text)
38
39 if __name__ == '__main__':
40 while True:
41 exec_cmd()
42 httpPost(cpu_data)
43 time.sleep(3600)



Part2:接收端


1 #CPU路由处理
2 @resource.route('/GetCpuResource',methods=['POST'])
3 def GetCpuResource():
4 '''接收来自linux上传的数据'''
5 query = request.get_json()
6 hostname = query["hostname"]
7 logic_cpu = query["logic_cpu"]
8 physical_cpu = query["physical_cpu"]
9 cpu_cores = query["cpu_cores"]
10 cpu_load = query["cpu_load"]
11 createtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
12 sql = "insert into cpu_info (hostname,logic_cpu,physical_cpu,cpu_cores,cpu_load,create_time) VALUES "
13 data = "('" + hostname + "','" + logic_cpu + "','" + physical_cpu + "','" + cpu_cores + "','" + cpu_load + "','" + str(createtime) + "'"
14 end = data + ")"
15 sql = sql + end
16 print(sql)
17 db = conndb()
18 db.execute_sql(sql)
19 data = {'code': 200, 'message': 'success', 'status': '10000'}
20 return json.dumps(data)



Part3:展示端

这部分主要分为以下两块内容:

第一块是页面请求


<template>
<div>
<div class="crumbs">
<el-breadcrumb separator="/">
<el-breadcrumb-item>
<i class="el-icon-lx-cascades"></i> CPU信息
</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="container">
<div class="handle-box">
<el-input v-model="query.hostname" placeholder="环境" class="handle-input mr10" clearable @clear="clear_name"></el-input>
<el-button type="primary" icon="el-icon-search" @click="handleSearch">搜索</el-button>
</div>
<el-table
:data="tableData"
border
class="table"
ref="multipleTable"
header-cell-class-name="table-header">
<el-table-column prop="id" label="ID" width="55" align="center"></el-table-column>
<el-table-column prop="hostname" label="环境"></el-table-column>
<el-table-column prop="logic_cpu" label="逻辑CPU"></el-table-column>
<el-table-column prop="physical_cpu" label="物理CPU"></el-table-column>
<el-table-column prop="cpu_cores" label="CPU核数"></el-table-column>
<el-table-column prop="cpu_load" width="255" label="CPU负载Avg[1min,5min,15min]"></el-table-column>
<!--<el-table-column prop="available" label="可用">-->
<!--<template #default="scope">-->
<!--<el-tag :type="availableplus(scope.row.available) === 'success' ? 'success': 'danger'">{{ scope.row.available }}</el-tag>-->
<!--</template>-->
<!--</el-table-column>-->
<el-table-column prop="create_time" width="160" label="创建时间"></el-table-column>
</el-table>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="query.pageIndex"
:page-sizes="[5, 10, 20, 30]"
:page-size="query.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="parseInt(pageTotal)">
</el-pagination>
</div>
</div>
</template>

<script>
import server from '../api/request.js'
export default {
name: 'InterfaceCpu',
data () {
return {
query: {
hostname: '',
pageIndex: 1,
pageSize: 10
},
tableData: [],
pageTotal: 0
}
},
created () {
this.getMemData()
},
methods: {
// 获取后端返回的真实数据
getMemData () {
server({url: '/getCpuList', data: this.query, method: 'post'})
.then(response => {
console.log('**********')
console.log(response)
this.tableData = response.listdata
console.log(this.tableData)
this.pageTotal = response.pageTotal || 5
})
},
// 触发搜索按钮
handleSearch () {
server({url: '/getCpuList', data: this.query, method: 'post'})
.then(response => {
console.log(response)
this.tableData = response.listdata
console.log(this.tableData)
this.pageTotal = response.pageTotal || 5
})
},
// 分页导航
handleSizeChange (val) {
// console.log(val)
this.$set(this.query, 'pageSize', val)
// console.log(this.query)
this.getMemData()
},
// 翻页改变页码触发
handleCurrentChange (val) {
this.$set(this.query, 'pageIndex', val)
this.getMemData()
},
clear_name () {
this.query.hostname = ''
this.getMemData()
},
freeplus(rows){
const free =rows.replace("M","")
// console.log(free)
// console.log(typeof free)
return Number(free) <100 ? 'danger' : 'success'
},
availableplus(rows){
const availabl =rows.replace("M","")
// console.log(free)
// console.log(typeof free)
return Number(availabl) <1000 ? 'danger' : 'success'
}
}
}
</script>

<style scoped>
.handle-box {
margin-bottom: 20px;
}

.handle-select {
width: 120px;
}

.handle-input {
width: 300px;
display: inline-block;
}
.table {
width: 100%;
font-size: 14px;
}
.red {
color: #ff0000;
}
.mr10 {
margin-right: 10px;
}
.table-td-thumb {
display: block;
margin: auto;
width: 40px;
height: 40px;
}
</style>



第二块是后端请求处理


1 @resource.route('/getCpuList',methods=['POST'])
2 def getCpuList():
3 '''fe的页面列表数据获取'''
4 query = request.get_json()
5 print(query)
6 if (query["hostname"] == ""):
7 sql1 = "select id,hostname,logic_cpu,physical_cpu,cpu_cores,cpu_load,create_time from cpu_info order by id DESC limit " + str(
8 (query['pageIndex'] - 1) * query["pageSize"]) + "," + str(query["pageSize"])
9 count_sql = "select count(*) from mem_info"
10 colume_sql = "select id from mem_info"
11
12 else:
13 sql1 = "select id,hostname,logic_cpu,physical_cpu,cpu_cores,cpu_load,create_time from cpu_info where hostname like '%" + str(query["hostname"]) + "%' order by id DESC" + " limit " + str(
14 (query['pageIndex'] - 1) * query["pageSize"]) + "," + str(query["pageSize"])
15 count_sql = "select count(*) from cpu_info where hostname like '%" + str(
16 query["hostname"]) + "%' order by id DESC"
17 colume_sql = "select id from cpu_info"
18
19 sql2 = "select id,hostname,logic_cpu,physical_cpu,cpu_cores,cpu_load,create_time from cpu_info"
20 db = conndb()
21 listdata = db.get_data(sql1, sql2)
22 db = conndb()
23 result = db.get_data(count_sql, colume_sql)
24 print(result)
25 pageTotal = result[0]['id']
26 print(listdata)
27 print(pageTotal)
28 data = {'listdata': listdata, "pageTotal": pageTotal, "code": 200}
29 return json.dumps(data)



Part4:页面展示

Python + Flask 实现接口接收 CPU 信息_json





欢迎关注【无量测试之道】公众号,回复【领取资源】

Python+Unittest框架API自动化、

Python+Unittest框架API自动化、

Python+Pytest框架API自动化、

Python+Pandas+Pyecharts大数据分析、

Python+Selenium框架Web的UI自动化、

Python+Appium框架APP的UI自动化、

Python编程学习资源干货、

资源和代码 免费送啦~

文章下方有公众号二维码,可直接微信扫一扫关注即可。

备注:我的个人公众号已正式开通,致力于IT互联网技术的分享。

包含:数据分析、大数据、机器学习、测试开发、API接口自动化、测试运维、UI自动化、性能测试、代码检测、编程技术等。

微信搜索公众号:“无量测试之道”,或扫描下方二维码:

Python + Flask 实现接口接收 CPU 信息_sql_02


添加关注,让我们一起共同成长!