12.1 基于Django的服务器信息查看应用(系统信息、用户信息)

news2024/9/23 3:20:47

文章目录

  • 新建Django项目
    • 创建子应用并设置本地化
    • 创建数据库表
    • 创建超级用户
    • git管理项目(requirements.txt、README.md、.ignore)
  • 主机信息监控应用的框架搭建
  • 具体功能实现
    • 系统信息展示
      • 前端界面设计
      • 视图函数设计
    • 用户信息展示
      • 视图函数设计
      • 自定义过滤器的实现
      • 前端界面设计

目标:使用 Python Django框架和psutil开发一个中文版 Linux 服务器信息查看应用,可查看的信息包括系统、CPU、内存、硬盘、进程、网络、登录用户等,同时可查看并导出部分数据的图表。

psutil模块参考文章:参考文章:https://www.cnblogs.com/saneri/p/7528283.html

新建Django项目

使用虚拟的解释器环境
下图中,应该将 Inherit global site-packages 勾选上
在这里插入图片描述

创建子应用并设置本地化

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建数据库表

Django项目自带后台管理
虽然新建的Django项目还没有加入新数据,但是Django项目自带的用户名之类的数据信息都需要存储到数据库中。

首先生成数据库迁移脚本
然后将迁移脚本写入数据库
在这里插入图片描述

创建超级用户

在这里插入图片描述
在Terminal运行项目:python manage.py runserver
浏览器访问
在这里插入图片描述
至此,项目最基本的搭建完成。

git管理项目(requirements.txt、README.md、.ignore)

右击项目名,新建.ignore文件在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
提示warning信息:
warning: in the working copy of ‘.idea/inspectionProfiles/profiles_settings.xml’, LF will be replaced by CRLF the next time Git touches it
根据文章:https://www.cnblogs.com/poppyCHN/p/16865100.html和https://www.cnblogs.com/outs/p/6909567.html。
做出以下修改:
在这里插入图片描述

将代码添加到本地仓库完成。在这里插入图片描述
然后使用:

pip freeze  # 列出当前环境已经安装的第三方模块
pip freeze > requirements.txt  # 输出重定向到requirements.txt 文件

右击新建File,新建README.md文件。

主机信息监控应用的框架搭建

路由视图函数前端模板
/views.indexindex.html
/user/views.useruser.html
/cpu/views.cpucpu.html
/memory/views.memorymemory.html
/disk/views.diskdisk.html
/network/views.networknetwork.html
/process/views.processprocess.html

在sysinfo项目的主路由文件设置,使得访问转入到子应用的路由文件
在这里插入图片描述
在子应用的路由配置文件中写明:不同的访问路径,执行相应的视图函数
在这里插入图片描述

在子应用host中编写视图函数,
sysinfo/host/views.py :

from django.shortcuts import render
# Create your views here.
def index(request):
    pass
    return render(request,'host/index.html',locals())
def user(request):
    pass
    return render(request,'host/user.html',locals())
def cpu(request):
    pass
    return render(request,'host/cpu.html',locals())
def memory(request):
    pass
    return render(request,'host/memory.html',locals())
def disk(request):
    pass
    return render(request,'host/disk.html',locals())
def network(request):
    pass
    return render(request,'host/network.html',locals())
def process(request):
    pass
    return render(request,'host/process.html',locals())

在template下新建host目录,并创建对应的HTML文件
在这里插入图片描述
至此,项目的框架搭建完成。

具体功能实现

系统信息展示

前端界面设计

新建 templates/host/base.html 文件:

<!DOCTYPE html>
<html {% block html_attribs %}{% endblock html_attribs %}>
<head>
    {% block head %}
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>{% block title %} {% endblock title %}</title>
        <link rel="stylesheet" type="text/css" href="/static/css/bootstrap.css">
        <link rel="stylesheet" type="text/css" href="/static/css/my-style.css">
        <script src="/static/js/jquery-3.1.1.min.js"></script>
    {% endblock head %}
</head>
<body>
<div class="sysinfo">
    <div class="navbar navbar-inverse" role="navigation">
        <div class="container">
            <div class="navbar-header">
                <a class="navbar-brand" href="/">Sys Info</a>
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li><a href="/">系统</a></li>
                    <li><a href="/cpu/">CPU</a></li>
                    <li><a href="/memory/">内存</a></li>
                    <li><a href="/disk/">硬盘</a></li>
                    <li><a href="/network/">网络</a></li>
                    <li><a href="/process/">进程</a></li>
                    <li><a href="/user/">用户</a></li>
                </ul>
            </div>
        </div>
    </div>
    <div class="container">
        {% block content %}{% endblock %}
    </div>
</div>
</body>
</html>

在templates/host/index.html 文件中包含 base.html 文件:

{% extends 'host/base.html' %}
{% block title %}Sys Info{% endblock %}
{% block content %}
    <div class="page-header">
        <h1>系统信息</h1>
    </div>
    <div>
        <table class="table table-bordered">
            <tr>
                <td>主机名</td>
                <td>{{ sys_name }}</td>
            </tr>
            <tr>
                <td>内核名称</td>
                <td>{{ kernel_name }}</td>
            </tr>
            <tr>
                <td>发行版本号</td>
                <td>{{ kernel_no }}</td>
            </tr>
            <tr>
                <td>内核版本</td>
                <td>{{ kernel_version }}</td>
            </tr>
            <tr>
                <td>系统架构</td>
                <td>{{ sys_framework }}</td>
            </tr>
            <tr>
                <td>现在时间</td>
                <td>{{ now_time }}</td>
            </tr>
            <tr>
                <td>开机时间</td>
                <td>{{ boot_time }}</td>
            </tr>
            <tr>
                <td>运行时间</td>
                <td>{{ up_time }}</td>
            </tr>
        </table>
    </div>
{% endblock %}

编辑 settings.py 文件:
在这里插入图片描述

测试:发现能展示出首页效果。但是还没有数据显示。这是因为还没写视图函数,业务逻辑还没实现。
在这里插入图片描述

视图函数设计

如果是在Linux系统下,通过python执行Linux命令就能获取到主机信息。

查看主机名、操作系统、内核版本、系统架构:hostnamectl 
查看系统名称: uname 
查看系统开机时间、已经运行了多长时间: top、w、uptime、 cat /proc/uptime
查看内核版本、系统架构: uname -r
获取系统架构: hostnamectl | grep Architecture | awk -F : '{print $2}'

python中执行Linux命令的方式一:
命令直接输出结果。但是很多情况下,希望把结果存起来。

在Linux系统下:
执行 ipython 命令(安装:pip install ipython)
import os
cmd="hostnamectl | grep Architecture | awk -F : '{print $2}'"
os.system(cmd) #执行命令,直接输出命令结果

python中执行Linux命令的方式二:

Linux下:
输入 python3 命令
import os
os.popen('hostname')  #返回的是一个文件对象
f= os.popen('hostname')
f.read()  #输出结果值
os.popen('hostname').read()

如果是在Windows下,无法执行Linux命令,该如何获取Linux服务器的这些信息???
通过 psutil 模块
参考文章:https://www.cnblogs.com/saneri/p/7528283.html

安装 psutil
在这里插入图片描述

视图函数编辑 host/views.py

from datetime import datetime
from django.shortcuts import render
import psutil
import os,platform

# Create your views here.
def index(request):
    try:
        info=os.uname()# linux系统下
    except:
        info=platform.uname() # Windows系统下
    sys_name=info.node
    kernel_name=info.system
    kernel_no=info.release
    kernel_version=info.version
    sys_framework=info.machine
    boot_time = datetime.fromtimestamp(psutil.boot_time())
    now_time = datetime.now()
    up_time = now_time - boot_time
    return render(request, 'host/index.html', locals())

测试:
在这里插入图片描述

用户信息展示

渲染就是将视图函数的变量信息填充到模板HTML页面中,最终返回给用户的过程。

视图函数设计

在 host/views.py 文件修改user 函数:

def user(request):
    users=psutil.users() #很多用户
    return render(request, 'host/user.html', locals())

自定义过滤器的实现

为了将用户登录时间显示的更友好,需要自定义过滤器。
自定义过滤器参考文档:https://docs.djangoproject.com/zh-hans/4.1/howto/custom-template-tags/
新建包 templatetags(包的名字是固定的)
新建python文件 timefilter.py ,实现过滤器
在这里插入图片描述
自定义的过滤器文件 timefilter.py :

from datetime import datetime
from django import template
register = template.Library() # 1、实例化库

@register.filter(name='timefmt') # 3、注册过滤器
def timefmt(value): # 2、具体实现过滤器
    """将时间戳转换为datetime类型的时间"""
    return datetime.fromtimestamp(value)

前端界面设计

编辑 templates/host/user.html 文件:
其中,extends 表示继承基模板
{% load timefilter %} 表示加载自定义过滤器文件
{{ user.started | timefmt }} 表示使用过滤器。这个过滤器可以是内置过滤器,也可以自定义过滤器

{% extends 'host/base.html' %}
{% load timefilter %}
{% block title %} 用户信息 {% endblock %}
{% block content %}
    <div class="page-header">
        <h1> 登录用户 </h1>
    </div>
    <div>
        <table class="table table-bordered">
            <tr>
                <td>用户名</td>
                <td>登录主机</td>
                <td>终端</td>
                <td>登录时间</td>
            </tr>
            {% for user in users %}
            <tr>
                <td>{{ user.name }}</td>
                <td>{{ user.host }}</td>
                <td>{{ user.terminal }}</td>
                <td>{{ user.started | timefmt }}</td>
            </tr>
            {% endfor %}
        </table>
    </div>
{% endblock %}

项目里添加文件之后,需要重启项目才能生效

测试:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/383263.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试用Python实现 -【广播服务器】

华为OD机试题 最近更新的博客华为 OD 机试 300 题大纲广播服务器题目输入输出示例一输入输出示例二输入输出Python代码代码编写思路最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题

常见的电脑运行卡顿原因及解决方法

大家在日常使用电脑过程中&#xff0c;会发现多开几个文件就卡顿&#xff0c;其实很多时候都跟C盘长期不清理有关&#xff0c;C盘的内存被下载的软件安装包、页面文件、休眠文件、更新文件等一系列的文件占据。大的文件甚至能占到20-30G&#xff0c;驱动人生就为大家带来几种解…

App防抓包的四种绕过方法(详细)

App防抓包的四种绕过方法简介&#xff1a;1、ssl证书校验&#xff08;https证书校验http请求ssl证书校验&#xff09;方法演示&#xff1a;安卓5.0怎么安装证书演示&#xff1a;安卓7及以上怎么把证书安卓到系统目录2、代理屏蔽3、证书绑定 &#xff08;SSL pinning&#xff09…

Easyrecovery数据恢复软件工作原理及使用介绍教程

Easyrecovery是一款强大的数据恢复软件&#xff0c;它专门解决磁盘数据恢复问题。在计算机世界里&#xff0c;数据丢失经常是一件令人头疼的事情&#xff0c;但是有了Easyrecovery&#xff0c;您可以放心大胆地享受数据备份和恢复的乐趣。EasyRecovery使用Ontrack公司复杂的模式…

(JUC)核心线程 和 救急线程的区别;Executors-固定大小线程池单线程线程池

核心线程 和 救急线程的区别 救急线程是有个生存时间的&#xff0c;它执行完任务了&#xff0c;过了一段时间&#xff0c;没有新任务了&#xff0c;救急线程就会销毁掉&#xff0c;变成结束的状态 核心线程没有生存时间&#xff0c;它执行完任务后&#xff0c;它仍然会被保存…

人机交互(软件工程视角)第一、二章部分题目答案

我认为日常生活中&#xff0c;我们学校的选课系统就在选课的时候就很不方便&#xff0c;具体是这样的&#xff0c;因为本来我们学校的选课的时候服务器负载能力就比较差&#xff0c;大家着急忙慌地选课的时候&#xff0c;很容易因为界面选课控件比较小&#xff0c;从而直接点击…

软测入门(四)Appium-APP移动测试基础

Appium 用来测试手机程序。 测试方面&#xff1a; 功能测试安装卸载测试升级测试兼容测试 Android系统版本不同分辨率不同网络 网络切换、中断测试使用中来电话、短信横竖屏切换 环境搭建 Java安装&#xff08;查资料&#xff09;Android SDK安装&#xff0c;配置 HOME和P…

FPGA纯verilog手写HDMI发送IP 提供源码和技术支持

目录1、前言2、设计思路和框架TMDS 编码算法OSERDESE串并转换3、顶层源码和IP封装4、源码和IP获取1、前言 本设计使用Xilinx原语和自己手写的代码实现了HDMI发送功能&#xff0c;纯verilog手写&#xff0c;有源码&#xff0c;也提供封装好的IP&#xff0c;你喜欢用例化的方式就…

WebRTC 系列之视频辅流

WebRTC 中的 SDP 支持两种方案&#xff1a; PlanB 方案 和 Unified Plan 方案。早期我们使用多PeerConnection的 Plan B 方案中只支持一条视频流发送&#xff0c;这条视频流&#xff0c;我们称之为”主流”。目前我们使用单 PeerConnection 的 Unified Plan 方案&#xff0c;新…

二叉树——把二叉搜索树转换为累加树

538. 把二叉搜索树转换为累加树 链接 给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&#xff08;Greater Sum Tree&#xff09;&#xff0c;使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下&#xf…

春天到了,来一场 VoxEdit 创作大赛吧!

春天的气息扑面而来&#xff0c;这是让你尽情绽放创造力的最佳时机&#xff01;我们将以「春天」为主题来一场 VoxEdit 大赛。在这里&#xff0c;你可以展示你的才华并赢得 $SAND 奖励&#xff01; 无论你是专业的设计师&#xff0c;还是仅仅喜欢创造美丽的艺术&#xff0c;这场…

有趣的阻抗变换

阻抗变换在很多人看来很神秘&#xff0c;甚至不可理喻&#xff1a; “什么是匹配网络&#xff1f;” “为什么要在负载电路之前加这么多电感电容&#xff1f;” “如果负载是100欧姆要与源阻抗50欧匹配&#xff0c;直接在负载并联一个100欧负载不就行了吗”……这样的问题常…

项目管理软件中日历的作用

为什么在项目管理软件中使用日历&#xff1f;日历是跟踪即将举行的会议、截止日期和里程碑的有用工具。它们可以帮助您可视化您的日程安排并提醒您重要事件&#xff0c;例如假期和休假时间。 虽然人们经常有各种各样的日历工具可供选择&#xff0c;包括从办公室墙上的纸质日历…

Stochastic Approximation 随机近似方法的详解之(二)Robbins-Monro Algorithm

6.2 Robbins-Monro Algorithm RM算法是随机近似领域的先驱性工作。众所周知的随机梯度下降算法是RM算法的一种特殊情况。后面我们再介绍具体的细节。 先看一个例子&#xff1a; 我们想要去求下面这个等式的根&#xff0c; BTW&#xff0c;很多问题可以被转化为求根问题。比…

嵌入式学习笔记——基于Cortex-M的单片机介绍

基于Cortex-M的单片机介绍前言生产厂商及其产品线ARM单片机的产品线命名规则留个作业习单片机的资料准备STM32开发所需手册1.芯片的数据手册作业2前言 本文继续接着上一篇中关于Cortex-M的介绍&#xff0c;来记录一些关于ARM系单片机的知识。 生产厂商及其产品线 芯片厂商在…

论坛性能测试难点有哪些?

1 测试工具方面 用户和业务模型分析搭建合适的脚本开发&#xff08;不根据用户和业务的模型来开发脚本&#xff0c;认为要回归成功即可&#xff09;合适的需求分析转化为场景设计&#xff08;不知道如何根据需求进行场景设计&#xff09;大容量系统的数据生成和使用大型系统的…

金蝶国产化中间件和人大金仓数据库

金蝶Apusic分布式消息队列不需要配置用户名密码rabbitmq:enable: truehost: 192.168.1.233port: 5672<!-- Spring Boot RabbitMQ 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</ar…

webrtc音频系列——4、RTP与RTCP协议

如果让你从0开发一套实时互动直播系统&#xff0c;你首先要选择网络传输协议。UDP 还是 TCP&#xff1f;答案是&#xff1a;UDP。为什么实时传输不能用 TCP &#xff1f;TCP 的目的就是实现数据的可靠传输&#xff0c;因此他有一套 握手&#xff0c;发送 -> 确认&#xff0c…

linux下安装jenkins

1.初始化Jenkins安装环境 系统版本&#xff1a;Red Hat Enterprise Linux 8.7 将脚本文件jenkins_install_env.sh 、 jenkins_install.sh和apache-maven-3.6.2-bin.tar.gz、jdk-8u251-linux-x64.tar.gz都上传到/usr/local/src目录下执行jenkins_install_env.sh脚本初始化Jenki…

嵌入式开发工具箱【持续更新中】【VMware、Ubuntutftp、nfs、SecureCRT、XShell、Source Insight 4.0】

一、概述 本文主要介绍嵌入式开发过程中需要用到的工具及简单的使用方法。避免在搭建嵌入式开发环境时&#xff0c;需要四处寻找文档&#xff0c;收藏此文章&#xff0c;一文搞定。 大多数嵌入式开发环境是使用Linux作为目标开发系统&#xff0c;所以开发主机一般都是Linux系统…