Django项目实战——轻量化部署平台
  TEZNKK3IfmPf 2023年11月14日 25 0

 

一、概述

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.项目、应用、服务器关系图

Django项目实战——轻量化部署平台

1.3.2.访问流程

  • 首页为登录页面,登录成功后,进入到项目信息展示页面info_view.html
  • info_view.html有三个超链接,点击超链接可以进入对应的管理页面
    Django项目实战——轻量化部署平台

1.3.3.设计思路

  • 使用Mysql数据库,创建ldp库和四张表,其中Project与App为一对多关系,App与Server为多对多关系
User表		#登录账号管理
Project表	#项目管理
App表		#应用管理
Server表	#服务器管理
  • 通过Django自带管理后台来管理User表

二、代码展示

Django项目实战——轻量化部署平台

2.1.ldp/settings.py

2.1.1.关闭CSRF

Django项目实战——轻量化部署平台

2.1.2.安装ldp应用

Django项目实战——轻量化部署平台

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,后期会不断完善

3.1.登录

Django项目实战——轻量化部署平台

3.2.项目管理

Django项目实战——轻量化部署平台

3.3.应用管理

Django项目实战——轻量化部署平台

3.4.服务器管理

Django项目实战——轻量化部署平台

3.5.信息展示

Django项目实战——轻量化部署平台

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月14日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月31日   36   0   0 python开发语言
  TEZNKK3IfmPf   2024年05月31日   27   0   0 python
  TEZNKK3IfmPf   2024年05月31日   28   0   0 python
TEZNKK3IfmPf