一、概述
1.1.环境信息
Windows10
Linux:CentOS 7.5
Python:3.6.7
Pycharm:2019.3.5
Django:3.0.5
Mysql:8.0.18
pymsql: 用于连接Mysql的Python模块
1.2.项目描述
通过前端页面,与后端数据进行交互,触发相应部署组件,实现应用模块的自动化、轻量化部署
1.3.项目设计
1.3.1.项目、应用、服务器关系图
1.3.2.访问流程
- 首页为登录页面,登录成功后,进入到项目信息展示页面info_view.html
- info_view.html有三个超链接,点击超链接可以进入对应的管理页面
1.3.3.设计思路
- 使用Mysql数据库,创建ldp库和四张表,其中Project与App为一对多关系,App与Server为多对多关系
User表 #登录账号管理
Project表 #项目管理
App表 #应用管理
Server表 #服务器管理
- 通过Django自带管理后台来管理User表
二、代码展示
2.1.ldp/settings.py
2.1.1.关闭CSRF
2.1.2.安装ldp应用
2.1.3.配置数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'ldp',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '192.168.137.2',
'PORT': '3306',
}
}
2.1.4.设置字体、时间
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False
2.2.ldp/urls.py
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('myldp/', include('myldp.urls')),
]
2.3.myldp/models.py
from django.db import models
# Create your models here.
# user表
class User(models.Model):
user = models.CharField(max_length=30) # 用户名
password = models.CharField(max_length=10)
name = models.CharField(max_length=30) # 名字
sex = models.CharField(max_length=10)
age = models.IntegerField()
lable = models.CharField(max_length=100)
class Meta:
db_table = "user" # 自定义数据库表名,默认为应用名_user
verbose_name_plural = "用户表" # 后台显示的名字,默认为表名s
def __str__(self):
return self.name # 当管理后台查询User表时,返回用户的名字,默认返回的是一个对象,不利于查看
# 项目表
class Project(models.Model):
name = models.CharField(max_length=30) # 名字
describe = models.CharField(max_length=100) # 描述信息
dtime = models.DateTimeField(auto_now_add=True) # 自动填充插入数据时的时间
class Meta:
db_table = "project" # 自定义数据库表名,默认为应用名_user
verbose_name_plural = "项目表" # 后台显示的名字,默认为表名s
def __str__(self):
return self.name # 当管理后台查询User表时,返回用户的名字,默认返回的是一个对象,不利于查看
# 服务器表
class Server(models.Model):
hostname = models.CharField(max_length=30) # 名字
ip =models.GenericIPAddressField()
describe = models.CharField(max_length=100) # 描述信息
dtime = models.DateTimeField(auto_now_add=True) # 自动填充插入数据时的时间
class Meta:
db_table = "server" # 自定义数据库表名,默认为应用名_user
verbose_name_plural = "服务器表" # 后台显示的名字,默认为表名s
def __str__(self):
return self.hostname # 当管理后台查询User表时,返回用户的名字,默认返回的是一个对象,不利于查看
# 应用表
class App(models.Model):
name = models.CharField(max_length=30) # 名字
describe = models.CharField(max_length=100) # 描述信息
dtime = models.DateTimeField(auto_now_add=True) # 自动填充插入数据时的时间
project = models.ForeignKey(Project, on_delete=models.CASCADE) # 定义一对多的模型关系,一个项目对多个应用
server = models.ManyToManyField(Server) # 定义App与Server多对多模型
class Meta:
db_table = "app" # 自定义数据库表名,默认为应用名_user
verbose_name_plural = "应用表" # 后台显示的名字,默认为表名s
def __str__(self):
return self.name # 当管理后台查询User表时,返回用户的名字,默认返回的是一个对象,不利于查看
2.4.myldp/__init__.py
import pymysql
pymysql.install_as_MySQLdb()
2.5.myldp/admin.py
from django.contrib import admin
from myldp import models
# Register your models here.
admin.site.register(models.User) # 注册user表到管理后台
admin.site.register(models.Project)
admin.site.register(models.App)
admin.site.register(models.Server)
2.6.myldp/views.py
from django.shortcuts import render,redirect
from django.http import HttpResponse
from myldp.models import User,Project,App,Server
# Create your views here.
# 首页
def index(request):
if request.method == "GET":
return render(request, 'login.html')
elif request.method == "POST":
# 获取前端登录的用户名和密码
username = request.POST.get('username', None)
password = request.POST.get('password', None)
# 遍历数据库user表,做登录验证
user_list = User.objects.all()
for info in user_list:
if username == info.user:
if password == info.password:
return redirect('info_view/')
msg = "用户名或密码错误"
return render(request, 'login.html', {"msg": msg})
# 项目管理
def manage_project(request):
if request.method == "GET":
return render(request, 'manage_project.html')
elif request.method == "POST":
project_name = request.POST.get('project_name', None)
project_info = request.POST.get('project_info', None)
# 遍历数据库Project表
project_list = Project.objects.all()
for info in project_list:
if project_name == info.name:
msg = "项目已存在"
return render(request, 'manage_project.html', {"msg": msg})
Project.objects.create(name=project_name, describe=project_info) # 把数据写入数据库
return redirect('/myldp/info_view')
# 服务器管理
def manage_server(request):
if request.method == "GET":
return render(request, 'manage_server.html')
elif request.method == "POST":
server_name = request.POST.get('name')
server_ip = request.POST.get('ip')
server_info = request.POST.get('describe')
# 遍历数据库Server表
server_list = Server.objects.all()
for info in server_list:
if server_name == info.hostname:
msg = "服务器已存在"
return render(request, 'manage_server.html', {"msg": msg})
Server.objects.create(hostname=server_name, ip=server_ip,describe=server_info) # 把数据写入数据库
return redirect('/myldp/info_view')
# 应用管理
def manage_app(request):
if request.method == "GET":
project_list = Project.objects.all()
server_list = Server.objects.all()
return render(request, 'manage_app.html', {'project_list':project_list,'server_list':server_list})
elif request.method == "POST":
app_name = request.POST.get('name')
app_info = request.POST.get('describe')
project_name = request.POST.get('project_name')
# 遍历数据库App表
app_list = App.objects.all()
for info in app_list:
if app_name == info.name:
msg = "应用已存在"
return render(request, 'manage_app.html', {"msg": msg})
project_obj = Project.objects.get(name=project_name)
server_list = request.POST.getlist('server_name') # 服务器可多选,获取一个列表
app = App.objects.create(name=app_name, describe=app_info, project=project_obj) # 应用于项目关联
# app.server.add(app)
for server in server_list:
server = Server.objects.get(hostname=server)
app.server.add(server) # app与server关联
return redirect('/myldp/info_view')
# 信息展示
def info_view(request):
app_list = App.objects.all()
for i in app_list:
print(i.server.all())
return render(request, 'info_view.html', {'app_list': app_list})
2.7.login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<h1>用户登录</h1>
<form action="" method="post">
用户名:<input type="text", name="username"><br> <!--输入的用户名保存到username变量,传回后端-->
密码: <input type="text", name="password"><br>
<button type="submit">登录</button><br>
</form>
<span style="color: red">{{ msg }}</span>
</body>
</html>
2.8.manage_project.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>项目管理</title>
</head>
<body>
<form action="" method="post">
项目名:<input type="text" name="project_name"><br>
项目描述:<input type="text" name="project_info"><br>
<button type="submit">创建</button><br>
</form>
<span style="color: red">{{ msg }}</span>
</body>
</html>
2.9.manage_app.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>应用管理</title>
</head>
<body>
<form action="" method="post">
应用名:<input type="text" name="name"><br>
服务器描述:<input type="text" name="describe"><br>
所属项目:
<select name="project_name" autofocus>
{% for project in project_list %}
<option value="{{ project.name }}">{{ project.name }}</option>
{% endfor %}
</select>
<br>
所属服务器:
<select name="server_name" multiple autofocus>
{% for server in server_list %}
<option value="{{ server.hostname }}">{{ server.hostname }}</option>
{% endfor %}
</select>
<br>
<button type="submit">创建</button><br>
</form>
<span style="color: red">{{ msg }}</span>
</body>
</html>
2.10.manage_server.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>应用管理</title>
</head>
<body>
<form action="" method="post">
应用名:<input type="text" name="name"><br>
服务器描述:<input type="text" name="describe"><br>
所属项目:
<select name="project_name" autofocus>
{% for project in project_list %}
<option value="{{ project.name }}">{{ project.name }}</option>
{% endfor %}
</select>
<br>
所属服务器:
<select name="server_name" multiple autofocus>
{% for server in server_list %}
<option value="{{ server.hostname }}">{{ server.hostname }}</option>
{% endfor %}
</select>
<br>
<button type="submit">创建</button><br>
</form>
<span style="color: red">{{ msg }}</span>
</body>
</html>
2.11.info_view.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>信息展示</title>
</head>
<body>
<h2><a href="/myldp/manage_project">项目管理</a></h2>
<h2><a href="/myldp/manage_app">应用管理</a></h2>
<h2><a href="/myldp/manage_server">服务器管理</a></h2><br>
<table border="5" cellpadding="10" cellspacing="2" align="center" width="500">
<thead> <!--定义表头-->
<tr>
<th>应用名</th>
<th>项目名</th>
<th>服务器名</th>
</tr>
</thead>
<tbody> <!--定义表的内容-->
{% for app in app_list %}
<tr>
<td>{{ app.name }}</td>
<td>{{ app.project.name }}</td>
<td>
{% for server in app.server.all %}
{{ server }}<br>
{% endfor %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
三、效果展示
PS:界面做得特别low,后期会不断完善