Django下自动升级环境

一、升级基本框架

1、效果图

#1号环境

 #2号环境

 

  2、view文件

import django
django.setup()
from django.shortcuts import render

# Create your views here.
import json
from random import randrange

from django.http import HttpResponse
from rest_framework.views import APIView

# from pyecharts.charts import Line
# from pyecharts import options as opts
from django.views.decorators.csrf import csrf_exempt
import time
from upgrade.data_process import FileOperate
import threading
from django.http import Http404
from django.contrib.auth.decorators import login_required
from learning_logs.models import Topic
from multiprocessing import Process
import datetime
import re


class DataProcess:
    def __init__(self):
        self.progress = 0
        self.status = 0

    def data_update(self):
        if self.status == 1:
            time.sleep(1)
            self.progress += 1
            if self.progress >= 99:
                self.progress = 99
        elif self.status == 2:
            self.progress = 100
        return {'value': self.progress}

    def status_update(self, status=0):
        if status == 0:
            self.progress = 0
        self.status = status


dp = DataProcess()
fo = FileOperate()


# Create your views here.
def response_as_json(data):
    json_str = json.dumps(data)
    response = HttpResponse(
        json_str,
        content_type="application/json",
    )
    response["Access-Control-Allow-Origin"] = "*"
    return response


def json_response(data, code=200):
    data = {
        "code": code,
        "msg": "success",
        "data": data,
    }
    return response_as_json(data)


def json_error(error_string="error", code=500, **kwargs):
    data = {
        "code": code,
        "msg": error_string,
        "data": {}
    }
    data.update(kwargs)
    return response_as_json(data)


JsonResponse = json_response
JsonError = json_error


env_info = {}


class ChartView(APIView):
    def get(self, request, *args, **kwargs):
        # js = json.loads(line_base())
        # js = dp.data_update()
        global env_info
        env_id = request.GET['env_id']
        env_id = int(env_id)
        if env_id in env_info.keys():
            if env_info[env_id]['tid'].is_alive():
                env_info[env_id]['flag'] = 0
                start_time = env_info[env_id]['start_time']
                now_time = datetime.datetime.now()
                env_info[env_id]['cost_time'] = (now_time - start_time).seconds

        if env_info.get(env_id, None) and env_info.get(env_id, None).get('cost_time', None):
            js = {'value': env_info[env_id]['cost_time']}
        else:
            js = {'value': 0}
        form = {"username": "root", "password": "root"}
        info = dict(js, **form)
        return JsonResponse(info)


cnt = 9


class ChartUpdateView(APIView):
    def get(self, request, *args, **kwargs):
        global cnt
        cnt = cnt + 1
        return JsonResponse({"name": cnt, "value": randrange(0, 100)})


class IndexView(APIView):
    def get(self, request, *args, **kwargs):
        """显示单个主题及其所有条目"""
        env_id = request.GET['env_id']
        topic = Topic.objects.get(id=int(env_id[1:]))

        # 确认请求的主题属于当前用户
        if topic.owner != request.user:
            raise Http404

        entries = topic.entry_set.order_by('-date_added')
        context = {'topic': topic, 'entries': entries}
        return render(request, 'index.html', context)


@csrf_exempt
@login_required
def reset(request, topic_id):
    global env_info
    data = {}
    vars_li = list(fo.read_json('config.json').keys())
    s = [''] * len(vars_li)
    dic = dict(zip(vars_li, s))
    locals().update(dic)

    """显示单个主题及其所有条目"""
    topic = Topic.objects.get(id=topic_id)

    # 确认请求的主题属于当前用户
    if topic.owner != request.user:
        raise Http404

    entries = topic.entry_set.order_by('-date_added')

    if request.method == 'POST':
        dp.status_update(status=0)
        for var in vars_li:
            vars()[var] = request.POST[var]
            data[var] = eval(var)
        print(data)
        print(entries[0].text)
        # if context['username'] != '1' or context['password'] != '1':
        #     return render(request, 'index.html', {'data': context})
        dp.status_update(status=1)
        # wait = WaitFinishWork()
        # wait.start()
        action = request.POST['action']
        if action == "reset":
            if topic_id not in env_info.keys():
                t = Process(target=reset_os, args=(entries[0].text,))
                t.start()
            elif topic_id in env_info and env_info[topic_id]['tid'].is_alive():
                env_info[topic_id]['tid'].terminate()
                env_info[topic_id]['tid'].join()
                t = Process(target=reset_os, args=(entries[0].text,))
                t.start()
            elif topic_id in env_info and not env_info[topic_id]['tid'].is_alive():
                t = Process(target=reset_os, args=(entries[0].text,))
                t.start()
            else:
                t = None
            start_time = datetime.datetime.now()
            env_info[topic_id] = {"tid": t, 'start_time': start_time, 'cost_time': 0, 'flag': 0}
        elif action == "stop":
            if env_info.get(topic_id, None):
                env_info[topic_id]['tid'].terminate()
                env_info[topic_id]['tid'].join()

    context = {'topic': topic, 'entries': entries, 'data': data}
    return render(request, 'index.html', context)


@csrf_exempt
@login_required
def upgrade_home(request):
    """显示所有的主题"""
    topics = Topic.objects.filter(owner=request.user).order_by('date_added')
    context = {'topics': topics}
    return render(request, 'upgrade_home.html', context)


class WaitFinishWork(threading.Thread):
    def run(self):
        time.sleep(20)
        dp.status_update(status=2)


def reset_os(info):
    for i in range(100):
        print(i, info)
        time.sleep(1)

3、模板文件

{% extends 'learning_logs/base.html' %}

{% block header %}
    <h2>{{ user.username }}升级 {{ topic }} 环境</h2>
{% endblock header %}

{% block content %}
    <p id="env_id" hidden="hidden">{{ topic.id }}</p>
    {% for entry in entries %}
        <div class="panel panel-default">
            <div class="panel-body">
                {{ entry.text|linebreaks }}
            </div>
        </div> <!-- panel -->
    {% empty %}
        There are no entries for this topic yet.
    {% endfor %}
    <form method="post" action="{% url 'upgrade:reset' topic.id %}">
<!--        {% csrf_token %}-->
        env username   <input type="text" name="username" value="root"><br>
        env password   <input type="text" name="password" value="root"><br>
        <input type="submit" name="action" value="reset">
        <input type="submit" name="action" value="stop"><br>
    </form>
    {% for key, value in data.items %}
    {{ key }} : {{ value }}<br>
    {% endfor %}
    <div id="bar" style="width:1000px; height:600px;"></div>
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts-nightly@5.1.2-dev.20210512/dist/echarts.min.js"></script>
    <script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
    <script>
        var chart = echarts.init(document.getElementById('bar'), 'white', {renderer: 'canvas'});
        var old_data = [];

<!--        var dom = document.getElementById("container");-->
<!--        var chart = echarts.init(dom);-->
        var option;
        option = {
            series: [{
                type: 'gauge',
                progress: {
                    show: true,
                    width: 18
                },
                axisLine: {
                    lineStyle: {
                        width: 18
                    }
                },
                axisTick: {
                    show: false
                },
                splitLine: {
                    length: 15,
                    lineStyle: {
                        width: 2,
                        color: '#999'
                    }
                },
                axisLabel: {
                    distance: 25,
                    color: '#999',
                    fontSize: 20
                },
                anchor: {
                    show: true,
                    showAbove: true,
                    size: 25,
                    itemStyle: {
                        borderWidth: 10
                    }
                },
                title: {
                    show: false
                },
                detail: {
                    valueAnimation: true,
                    fontSize: 80,
                    offsetCenter: [0, '70%']
                },
                data: [{
                    value: 0
                }]
            }]
        };


        chart.setOption(option);

        $(
            function () {
                fetchData(chart);
                setInterval(fetchData, 2000);
            }
        );

        function fetchData() {
            $.ajax({
                type: "GET",
                url: "http://127.0.0.1:8000/upgrade/line",
                data:{
                    "env_id": $("#env_id").text(),
                },
                dataType: 'json',
                success: function (result) {
                    var options = chart.getOption();
                    options.series[0].data[0].value = result.data.value;
                    chart.setOption(options);
                    old_data = chart.getOption().series[0].data;
                }
            });
        }

    </script>
{% endblock content %}

二、支持删除环境

1、修改patch

diff --git a/learning_logs/templates/learning_logs/topic.html b/learning_logs/templates/learning_logs/topic.html
index 064b8cb..c5c8d04 100644
--- a/learning_logs/templates/learning_logs/topic.html
+++ b/learning_logs/templates/learning_logs/topic.html
@@ -17,6 +17,8 @@
                     <small>
                         <a href="{% url 'learning_logs:edit_entry' entry.id %}">
                             edit entry</a>
+                        <a href="{% url 'learning_logs:delete_entry' entry.id %}" class="ex1"
+                           onclick="return confirm('永久删除此条目,请确认!');"> 删除</a>
                     </small>
                 </h3>
             </div>
diff --git a/learning_logs/templates/learning_logs/topics.html b/learning_logs/templates/learning_logs/topics.html
index ba957d5..e0042f4 100644
--- a/learning_logs/templates/learning_logs/topics.html
+++ b/learning_logs/templates/learning_logs/topics.html
@@ -11,6 +11,10 @@
             <li>
                 <h3>
                     <a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a>
+                    {% if topic.owner == user %}
+                        <small><a href="{% url 'learning_logs:delete_topic' topic.id %}" class="ex1"
+                                  onclick="return confirm('永久删除此主题,请确认!');"> 删除</a></small>
+                    {% endif %}
                 </h3>
             </li>
         {% empty %}
diff --git a/learning_logs/urls.py b/learning_logs/urls.py
index d9def4a..a81360c 100644
--- a/learning_logs/urls.py
+++ b/learning_logs/urls.py
@@ -1,6 +1,6 @@
 """定义learning_logs的URL模式"""
 
-from django.urls import path
+from django.urls import path, re_path
 
 from . import views
 
@@ -22,4 +22,13 @@ urlpatterns = [
 
     # 用于编辑条目的网页
     path('edit_entry/<int:entry_id>/', views.edit_entry, name='edit_entry'),
+
+    # 用于删除自有条目的页面
+    re_path('delete_entry/(?P<entry_id>\d+)/', views.delete_entry, name='delete_entry'),
+
+    # 用于删除自有主题的页面
+    re_path('delete_topic/(?P<topic_id>\d+)/', views.delete_topic, name='delete_topic'),
 ]
\ No newline at end of file
diff --git a/learning_logs/views.py b/learning_logs/views.py
index 1c5cea5..f81ed37 100644
--- a/learning_logs/views.py
+++ b/learning_logs/views.py
@@ -97,3 +97,45 @@ def edit_entry(request, entry_id):
     context = {'entry': entry, 'topic': topic, 'form': form}
     return render(request, 'learning_logs/edite_entry.html', context)
 


+@login_required
+def delete_entry(request, entry_id):
+    '''删除选定条目'''
+    entry = Entry.objects.get(id=entry_id)
+    topic = entry.topic
+    check_topic_owner(topic, request)
+    entry.entry_hide = True
+    entry.delete()
+
+    return HttpResponseRedirect(reverse('learning_logs:topic', args=[topic.id]))
+
+
+@login_required
+def delete_topic(request, topic_id):
+    '''删除选定主题'''
+    topic = Topic.objects.get(id=topic_id)
+    check_topic_owner(topic, request)
+    topic.topic_hide = True
+    topic.delete()
+
+    return HttpResponseRedirect(reverse('learning_logs:topics'))
+
+
+def check_topic_owner(topic, request):
+    if topic.owner != request.user:
+        raise Http404
+
+
+def check_topic_public(topic, request):
+    if topic.public != True:
+        raise Http404
\ No newline at end of file

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值