个人博客,记录知识防止遗忘
使用django编写一个脚本管理平台
使用django编写一个脚本管理平台

使用django编写一个脚本管理平台

由于我需要经常登陆服务器执行一些脚本,而各种脚本分布在不同服务器的不同路径下,很多时候都极不方便。
所以闲暇时间用django框架编写了一个简单的管理平台,将部分脚本整合起来做个页面,使用起来会方便很多。

内容大纲

1 背景介绍

某服务器上部署了几百个“channel”和“save”,每个channel和save都由脚本启动和暂停,例如:

start.sh channel 1      会启动  channel 1,
stop.sh channel 1       会关闭  channel 1,
start.sh save 1         会启动 save 1,
stop.sh save 1          会关闭 save 1

而每个channel 都有与之对应的配置文件以及日志文件

很多时候业务调整需要修改配置文件并重启,每次都得登录服务器,进入特定目录执行脚本。
所以需要编写一个简单的管理平台解放双手

2 需求分析:

首先自己确定需求,我计划实现3各页面,分别对应“登录鉴权”、“相关信息展示及脚本启停操作”、“配置文件修改及日志查看”。

“登录鉴权”需要做成装饰器,搭配session实现“超时重新登录”的功能;
“信息展示和脚本启停”这是最主要的页面,会查询数据库展示一些重要信息,结合html的ajax,实现一键启停等
“配置文件修改及日志查看”这是一个html的 textarea 标签,后端会使用 paramiko模块登录服务器后结合linux命令拉取相应文件内容。可以在该页面对内容进行编辑后再次提交,会覆盖上传至服务器的相应位置。

为了实现以上功能,需要进行以下工作:

  • 搭建一个django环境(创建project/app),连接服务器数据库,配置一些参数(setting文件)
  • 根据服务器数据库,反向生成(inspectdb) model
  • 编写后端代码(urls/views等)
  • 编写前端文件(html/js)
  • 测试及优化

3 实现过程:

3.1 搭建django环境

首先搭建基础的django环境,随后创建project/app ,安装所需的库和模块;
随后修改settings.py,主要包括:

INSTALLED_APPS  中加入app的名称
ROOT_URLCONF    指定总urls的路径及文件名,如 ROOT_URLCONF = 'project_1.urls'

LANGUAGE_CODE = 'zh-hans'      把英文改为中文
TIME_ZONE = 'Asia/Shanghai'    把国际时区改为中国时区

STATIC_URL = '/static/'        设置静态资源的路径,如js
STATICFILES_DIRS = [
    BASE_DIR+"/static",
]

创建static静态文件目录:
在django的项目目录下创建一个static目录。(本文后续会用到jquery.js,到时候下载后直接放里边即可)
image.png

3.2 settings.py中定义数据库相关信息

django默认定义了一个文件型数据库sqlite,此处不谈,我选择新建3个mysql数据库的连接,如下图所示:
core和manage是之前项目本身就已经存在的数据库,本文中直接读取其上的数据,处理并展示。
default是django默认的数据库,必须存在不能删除!本文中我用来存放产生的session之类的数据。
image.png

定义了数据库连接后,还要配置数据库路由,同样也是在settings.py中

# 将创建的app与数据库对应起来
DATABASE_APPS_MAPPING = {
    'channel_manage': 'manage',
    'eums_sms_core': 'core',
}
DATABASE_ROUTERS = ['channel_manage.database_router.DatabaseAppsRouter']

3.3 inspectdb 反向生成model

django使用model来操作数据库,使用很方便,但是model定义起来也很麻烦,所以django提供了一个命令,可以将已连接的数据库自动识别为对应的model代码

# 前提是创建了对应app并且在setting.py文件中注册过
# (本文中用的app是channel_manage 和 eums_sms_core )
# --database 后跟 数据库别名 后跟具体的表,若不指定表名则以为所有表
python manage.py inspectdb --database core   table1 table2 > eums_sms_core/models.py
python manage.py inspectdb --database manage table1 table2 > manage/models.py

3.4 django的urls路由编写

根据需求,写了以下几条路由,分别指向具体的函数中
image.png

3.5 django的views编写

channel_manage 的 view中主要是登录鉴权相关的函数,如下图所示:
image.png

eums_sms_core中主要是信息展示、服务状态查询、服务启动停止、服务日志打印、服务配置文件编辑(拉取和上传是2个不同的函数);另外定义了2个工具函数,分别用于ssh连接服务器以及scp传输文件;具体如下图所示
image.png

3.6 django的templates模板编写

view函数经过处理后,基本都会将结果传给指定的html页面进行渲染展示。
前端的html语言不是很懂,之能写一些简陋的页面出来,勉强可以使用,共有以下几个
image.png

3.6.1 主页

编辑 channel_list.html页面
① 首先结合django的模板语言编写基本的页面,服务功能只需要调用后续的函数即可。
详细的django模板语言用法,可以参考这篇文章: django模板语言用法及实例

image.png
② 引入 jQuery。jQuery 是一个 JavaScript 库,其中有很多现成的“轮子”供使用。
访问jQuery官网即可下载,随后将jquery.js 放进/static目录即可
image.png

③ 编写对应函数
这里用到了jQuery的 ajax,ajax可以在不刷新页面的情况下发送并接受后端数据。
jQuery的ajax使用方法,可以参考此文章: jQuery的ajax使用

本文中我想实现以下功能:
点击按钮,就连接服务器,执行响应的命令,然后将执行结果返回页面,并以提示框的形式弹出
image.png

3.6.2 配置文件编辑页面

image.png

3.6.3 登录页面

image.png

3.6.4 日志打印页面

image.png

4 结果展示:

进入虚拟环境,在项目目录下使用以下命令启动django。

# 默认监听8000端口
python  manage.py runserver 

# 也可指明相应ip和端口
python  manage.py runserver 192.168.1.46:8080

随后用浏览器访问该页面
image.png
登陆后会跳转到主页面
image.png

查看状态,启停相应服务
image.png
编辑 channel 596 的配置文件并提交
image.png
查看channel596的实时日志
image.png

5 关闭DEBUG模式

django 默认情况下是出于开发者模式,此模式下访问页面,django会返回很多关键信息便于开发人员判断和修改代码,但是在正式上线之前,此功能必须关闭,否则会有极大安全隐患。

关闭debug模式很容易,只需要在settting.py中将DEBUG设为False即可,但是当关闭debug之后,会额外出现一些问题: django的静态资源不再会主动加载

生产环境中一般都是将动态资源和静态资源分开处理(动态请求交给django,静态请求先过缓存),所以django便不再自动加载静态资源,此时需要手动引入。

此问题的解决,网上有很多介绍,经过尝试,发现有一种可以解决,链接如下:
https://zhuanlan.zhihu.com/p/300762987

我使用该文章推荐的方法完美解决,解决过程记录如下:

首先修改setting.py,关闭debug;允许所有主机访问
image.png

新增STACIC_ROOT
image.png

urls.py中引入相应模块,并新增路径匹配
image.png

另外,也可以去看django的官方文档,有详细解释:
https://docs.djangoproject.com/en/3.0/howto/static-files/

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注