(Django) Как следить за процессом резервного копирования и восстановления базы данных в одном view.py файл?

#python #html #mysql #django #database

#python #HTML #mysql #django #База данных

Вопрос:

Я новичок в Django, и сейчас я разрабатываю приложение Django для резервного копирования и восстановления баз данных MySQL. Рабочий процесс этого приложения содержит 4 шага:

  1. получите параметры целевой базы данных со страницы html;
  2. получите исходные параметры базы данных или загрузите файл sql со страницы html;
  3. выберите таблицы данных;
  4. проверьте и подтвердите данные для загрузки.

Я использовал несколько кнопок для отправки параметров на HTML-странице, и каждая из них ссылается на ifelse в функции post. Коды приведены ниже. Кажется, что после того, как я вернул рендеринг, параметры, подключение к базе данных и курсор не могут быть «общими» во всей функции. Как я могу с этим справиться?

Python3.6 django2.1

 # views.py
#-*-coding:utf-8 -*-
import os
import os.path
import sys
import datetime
from builtins import int

from django.db import models
from django.shortcuts import render
from django.views import View
from django.http import HttpResponse

import pymysql
# Create your views here.

class IndexView(View):
    template_name = 'add_struc/index.html'


    def get(self, request):
        return render(request, 'add_struc/index.html',)

    def post(self, request):
        if request.method == 'POST' and 'Tgt_link' in request.POST:
        # pressed confirm in step 1. 在步骤1按下了设置目标数据库的链接 

            Tgt_link = {}
            Tgt_ip = request.POST.get('Tgt_ip')
            Tgt_port = int(request.POST.get('Tgt_port'))
            Tgt_db = request.POST.get('Tgt_db')
            Tgt_name = request.POST.get('Tgt_name')
            Tgt_passwd = request.POST.get('Tgt_passwd')
            Tgt_char = request.POST.get('Tgt_char')

            # # connect to target db and get the cursor. 连接目标数据库,获取游标。
            # self.Tgt_database = pymysql.connect(
            #     host=Tgt_ip,
            #     port=Tgt_port,
            #     db=Tgt_db,
            #    user=Tgt_name,
            #     passwd=Tgt_passwd,
            #     charset='utf8'
            #     )
            # self.Tgt_cursor = database.cursor()

            Tgt_link = {'Tgt_ip':Tgt_ip, 'Tgt_port':Tgt_port,'Tgt_db':Tgt_db,'Tgt_name':Tgt_name,'Tgt_passwd':'******', 'Tgt_char':Tgt_char,}
            self.Tgt = Tgt_link
            context = Tgt_link
            # yield self.Tgt
            return render(request, 'add_struc/index.html', context=context)



        elif request.method == 'POST' and 'Ori_link' in request.POST:
            # pressed confirm in step 2.在步骤2按下了设置源数据库的链接
            Ori_link = {}
            # 数据源链接
            Ori_ip = request.POST.get('Ori_ip')
            Ori_port = int(request.POST.get('Ori_port'))
            Ori_db = request.POST.get('Ori_db')
            Ori_name = request.POST.get('Ori_name')
            Ori_passwd = request.POST.get('Ori_passwd')
            Ori_char = request.POST.get('Ori_char')

            # connect to origin db (data source) and get the cursor. 连接源数据库,获取游标。
            self.Ori_database = pymysql.connect(
                host=Ori_ip,
                port=Ori_port,
                db=Ori_db,
               user=Ori_name,
                passwd=Ori_passwd,
                charset='utf8'
                )

            self.Ori_cursor = self.Ori_database.cursor()
            # back up origin db to csv or sql file 备份数据库为sql文件或csv
            self.Ori_cursor.close()
            self.Ori_database.close()

            Ori_link = {'Ori_ip':Ori_ip, 'Ori_port':Ori_port, 'Ori_db':Ori_db, 'Ori_name':Ori_name, 'Ori_passwd':'******', 'Ori_char':Ori_char,}
            # context = self.Tgt.update(Ori_link)
            context = Ori_link
            return render(request, 'add_struc/index.html', context=context)

        elif request.method == 'POST' and 'upload_file' in request.POST:
            # uploaded a sql file or csv file in step 2. 在步骤2上传了数据包文件
            return render(request, 'add_struc/index.html')

        elif request.method == 'POST' and 'sheet_selected' in request.POST:
            # confirmed the data sheets in step3. 在步骤3选好了数据表
            return render(request, 'add_struc/index.html')


        elif request.method == 'POST' and 'start_import' in request.POST:
            # confirm alter and close db connections.在步骤4开始执行导入
            return render(request, 'add_struc/index.html')
  

Комментарии:

1. Кажется, вам следует использовать TemplateView first:docs.djangoproject.com/en/2.2/ref/class-based-views/base /…

Ответ №1:

Разделите этот класс представления на несколько с разными путями URL, что-то вроде этого:

 class Step1View(TemplateView):
    template_name = 'xxx'
    def post(self, request):
        if 'button1' is clicked:
            return redirect('/step2')
        elif 'button2' is clicked:
            return redirect('/step3')

class Step2View(Step1View):
    def post(self, request):
        # do something