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

46 篇文章 2 订阅
22 篇文章 0 订阅

目标:使用 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 %}

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

测试:

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值