Python自動化運維以前端部署Mysql架構(二)

正文開始:
html


Python自動化運維前端







前端部署Mysql架構二python

本文大綱mysql

Attention
ios

  1. 前端展現
sql

  2. models.py 數據模型數據庫

  3. forms.py 表單django

  4. views.py 程序邏輯後端

  5. 效果展現數組


前端展現

01



1.1 頁面展現


圖片


1.2 html頁面代碼


在templates/Cloud的目錄下,新建一個網頁,編輯 mys_install.html 頁面。


圖片

關鍵代碼

  1                <div class="box-body big">
 2                            <style>.textCetent{text-align:center;}</style>
 3                                            <h3 class="form-title " >請輸入主機和數據庫的相關信息...</h3>
 4                                            <div class="separator"></div>
 5                                            <form class="form-horizontal" role="form" action="." method="post">{% csrf_token %}
 6
 7                                              <div class="form-group">
 8                                                <label  for="{{ mys_install_form.db_ipaddr.id_for_label }}" class="col-sm-2 control-label">IP地址</label>
 9                                                <input type="text" class="form-control" name="db_ipaddr"  style="width:1000px;" placeholder="請輸入IP地址">
10                                              </div>
11
12                                              <div class="form-group">
13                                               <label  for="{{ mys_install_form.db_port.id_for_label }}" class="col-sm-2 control-label">端口</label>
14                                                <input type="text" class="form-control" name="db_port" style="width:1000px;" placeholder="請輸入端口">
15                                              </div>
16
17                                              <div class="separator"></div>
18                                              <div class="form-group">
19                                                <label class="col-sm-2 control-label">操做系統</label>
20                                                <div class="col-sm-8">
21                                                 <div class="row">
22                                                     <div class="col-lg-6">
23                                                     <div class="input-group">
24                                                        <label for="{{ mys_install_form.os_user.id_for_label }}" class="input-group-addon" type="button">&nbsp;OS用戶名</label>
25                                                      <input type="text" class="form-control" name="os_user">
26                                                    </div>
27                                                </div>
28                                                    <div class="col-lg-6">
29                                                    <div class="input-group">
30                                                        <label for="{{ mys_install_form.os_passwd.id_for_label }}" class="input-group-addon" type="button">OS密碼</label>
31                                                      <input   type="password" class="form-control" name="os_passwd">
32                                                    </div>
33                                                  </div>
34                                                </div>
35                                              </div>
36                                              </div>
37
38                                              <div class="separator"></div>
39
40                                                <div class="form-group">
41                                                <label class="col-sm-2 control-label">數據庫</label>
42                                                <div class="col-sm-8">
43                                                 <div class="row">
44                                                     <div class="col-lg-6">
45                                                     <div class="input-group">
46                                                        <label for="{{ mys_install_form.app_name.id_for_label }}" class="input-group-addon" type="button">&nbsp;業務簡稱&nbsp;</label>
47                                                      <input type="text" class="form-control" name="app_name">
48                                                    </div>
49                                                </div>
50                                                    <div class="col-lg-6">
51                                                    <div class="input-group">
52                                                        <label for="{{ mys_install_form.innodb_mem.id_for_label }}" class="input-group-addon" type="button">DB緩存</label>
53                                                      <input   type="text" class="form-control" name="innodb_mem" placeholder="請輸入Innodb緩存&nbsp;(MB)&nbsp;">
54                                                    </div>
55                                                  </div>
56                                                </div>
57                                              </div>
58                                              </div>
59
60                                                <div class="form-group">
61                                                <label class="col-sm-2 control-label">   </label>
62                                                <div class="col-sm-8">
63                                                 <div class="row">
64                                                     <div class="col-lg-6">
65                                                     <div class="input-group">
66                                                        <label for="{{ mys_install_form.db_charset.id_for_label }}" class="input-group-addon" type="button" >DB字符集</label>
67                                                      <input type="text" class="form-control"  name="db_charset">
68                                                    </div>
69                                                </div>
70                                                    <div class="col-lg-6">
71                                                    <div class="input-group">
72                                                        <label for="{{ mys_install_form.db_passwd.id_for_label }}" class="input-group-addon" type="button">DB密碼</label>
73                                                      <input   type="password" class="form-control" name="db_passwd">
74                                                    </div>
75                                                  </div>
76                                                </div>
77                                              </div>
78                                              </div>
79
80
81                                             <div class="form-group">
82                                                 <label for="{{ mys_install_form.install_type.id_for_label }}" class="col-sm-2 control-label">請選擇安裝類型 </label>
83                                                   <div class="col-md-3 " >
84                                                  {{ mys_install_form.install_type }}
85                                                 </div>
86                                             </div>
87                                                  <div class="form-group">
88                                                    <label for="{{ mys_install_form.db_type.id_for_label }}" class="col-sm-2 control-label">請選擇數據庫版本</label>
89                                                    <div class="col-md-3">
90                                                            {{ mys_install_form.db_type }}
91                                                    <!-- <div class="divide-10"></div> 上下欄目距離 -->
92                                                    </div>
93                                                  </div>
94
95                                              <div class="form-group">
96                                                <label for="{{ mys_install_form.pub_date.id_for_label }}" class="col-sm-2 control-label"> 日期</label>
97                                                   <div class="col-md-3"  >
98                                                  {{ mys_install_form.pub_date }}
99                                              </div>
100                                             </div>
101
102                                                  <div class="divide-10"></div>
103                                                  <div class="form-group">
104                                                    <label class="col-sm-2 control-label">添加任務列表</label>
105                                                    <div class="col-sm-9">
106                                                        <button type="submit" class="btn btn-success btn-lg">提交任務</button>
107                                                    </div>
108                                                  </div>
109
110                                                  <div class="form-group" >
111                                                    <label class="col-sm-2 control-label">重置當前任務</label>
112                                                    <div class="col-sm-9">
113                                                        <button type="reset" class="btn btn-purple btn-lg">Reset</button>
114                                                    </div>
115                                                  </div>
116
117                                             </form>
118                                        </div>
119                                    </div>
120                                </div>
121                            </div>
122                            <!-- SAMPLE -->
123                            </div>
124                            <!-- /SAMPLE -->
125                        </div>
126                    </div>
127                    <!-- /FORMS -->


說明
5
制定表單,acthon=".",當前頁面。
5
{% csrf_token %},前段經過POST方式 提交數據,免受CSRF***,與表單內容一同被提交。
7
form-group,表單。
8
mys_install_form.db_ipaddr.id_for_label , 來自於views.py的 mys_install函數,mys_install函數須要forms的 MysInstallForm表單,該表單函數須要models.py的Mys_Install_Profile函數。每一個html的表單,均如此類推。    
9
<input>裏面的name必定要有,不然沒法對號入座。
84
mys_install_form.install_type , mys_install_form來自於views.py的函數,install_type是安裝類型。
90 mys_install_form.db_type , mys_install_form來自於views.py的函數,db_type是數據庫版本。    
106
113
重置表單。


弄清楚第8點的邏輯,這是一個反向思惟,由前端推到後端如何實現,這是承上啓下的關鍵。


接下來,咱們使用正向思惟,一個個攻克。



models.py 數據模型

02



2.1 構造數據模型


編輯models.py,添加Mys_Install_Profile函數。


 1class Mys_Install_Profile(models.Model):
2    #ipaddress = models.GenericIPAddressField()    ### more ip cant input
3    db_ipaddr      = models.CharField(max_length=100)
4    db_port        = models.CharField(max_length=50)
5    os_user  = models.CharField(max_length=30)
6    os_passwd  = models.CharField(max_length=100)
7    app_name    = models.CharField(max_length=30)
8    innodb_mem  =  models.CharField(max_length=30)
9    db_charset  = models.CharField(max_length=30)
10    db_passwd   = models.CharField(max_length=30)
11    install_type  = models.CharField(max_length=100)
12    db_type  = models.CharField(max_length=100)
13    pub_date  = models.DateTimeField(default=timezone.now)   # pub_date  # auto_now=True
14    zh_install_type  = models.CharField(max_length=100,null=True,default='')
15    zh_db_type  = models.CharField(max_length=100,null=True,default='')
16    class Meta:
17        ordering = ("-pub_date",)
18
19    def __str__(self):
20        return self.db_ipaddr


說明
2
models模塊也有本身IP字段,但這裏爲了不更多錯誤嘗試,先直接選用字符串代替。
6
os_password也是字符串,若是要在前端顯示爲"*",那麼就要html頁面將input標籤的type改成"password"。
13
使用日期類型,須要導入timezone模塊,
from django.utils import timezone。
16-17
在admin管理界面,使用日期排序。


將以上數據模型同步到數據庫中,這也是整個應用程序中最簡單的一步。


1python manage.py migrate



forms.py 表單

03




1.4 根據model模塊製造表單

編輯views.py,導入model模塊

1from .models import Mys_Install_Profile


編輯MysInstallForm函數,這裏直接使用model模塊的字段,而且對於install_type和db_type進行改造,使之能在前端顯示。

 1class MysInstallForm(forms.ModelForm):
2
3    install_type_list = ((1,'首次安裝'),(2,'新增安裝'),(3,'還原重裝'),(4,'刪庫跑路'),)
4    db_type_list   = ((1,'Mysql 5.7.30'),(2,'Mysql 8.0'),)
5    install_type = forms.CharField(initial=1,widget=forms.RadioSelect(choices=install_type_list))
6    db_type   = forms.CharField(widget=forms.Select(choices=db_type_list))
7    class Meta:
8        model = Mys_Install_Profile
9        fields= ["db_ipaddr","db_port","os_user","os_passwd","app_name","innodb_mem","db_charset","db_passwd","pub_date"]
10
11    def __init__(self, *args, **kwargs):
12        super(MysInstallForm, self).__init__(*args, **kwargs)
13        for field_name in self.base_fields:
14            #print(field_name)         ### 刷出FORM名字
15
16            field = self.fields[field_name]
17            if field_name != 'install_type':
18                field.widget.attrs.update({"class""form-control"})
19            else:
20                field.widget.attrs.update({"class""uniform"})
21
22    def zh_ins_type(self):
23        zh_ins_tylt = []
24        cd = self.cleaned_data   ### 返回選項的代碼數字爲字符串,與這裏的自定義選項int類型不一樣。
25        print("CD:",cd)
26        for type in self.install_type_list:
27            if str(type[0]) == cd['install_type']:
28                print(type[0],type[1])
29                #zh_install_type = type[1]
30                zh_ins_tylt.append(type[1])
31        for type in self.db_type_list:
32            if str(type[0]) == cd['db_type']:
33                print(type[0],type[1])
34                #zh_db_type = type[1]
35                zh_ins_tylt.append(type[1])
36        print(zh_ins_tylt)
37        return zh_ins_tylt


說明
1
forms.ModelForm是forms裏面經常使用的類,若是要將表單的數據寫入數據庫表裏面或者修改值,則讓表單類繼承ModelForm類;若是提交不會對數據庫操做,好比只是驗證之類的,則使用Form類。
3-4
在表單內相關字段從新定義兩個變量。
5
部署類型,inital=1,即前端顯示默認選中首次安裝,可是數據庫層面僅僅是記錄數值,故在該MysInstallForM類裏面還須要定義zh_ins_type來根據數值換取對應的中文。
6
安裝Mysql數據庫版本,默認在前端顯示5.7.30,其數值對應的中文與第5點相同。
17
install_type有點奇特,多是radioselect類型有點不同,反正要用"uniform",若是不用,選項很大,很是醜陋!前端高手請跳過。
22-37
zh_ins_type就是爲了識別前端的數字,來到後端如何將數字和中文匹配起來。



views.py 程序邏輯

04



4.1 邏輯層 views.py 處理表單


編輯views.py 導入 forms 表單

1from .forms import MysInstallForm    ### mysql數據庫安裝


新增mys_install 請求函數。

 1def mys_install(request):
2    iplist = ['192.168.117.100''192.168.117.50''192.168.117.60''192.168.117.30']
3    if request.method == "POST":
4        mys_install_form = MysInstallForm(request.POST)
5        #print(mys_install_form)
6        if mys_install_form.is_valid():
7            zh_ins_tylt = mys_install_form.zh_ins_type()
8            print(zh_ins_tylt)
9            new_mys_install = mys_install_form.save(commit=False)
10            inp_ip = mys_install_form.cleaned_data['db_ipaddr']
11            install_type = mys_install_form.cleaned_data['install_type']  ### 表單須要更新進去到數據庫裏面
12            db_type = mys_install_form.cleaned_data['db_type']
13            inp_iplist = re.split(",| ", inp_ip)
14            print(inp_iplist)
15            if set(inp_iplist).issubset(set(iplist)):
16                new_mys_install.install_type = install_type
17                new_mys_install.db_type = db_type
18
19                ### 選項中文字符串
20                new_mys_install.zh_install_type = zh_ins_tylt[0]
21                new_mys_install.zh_db_type      = zh_ins_tylt[1]
22
23                new_mys_install.save()
24                dict_Mys_Install = mys_install_form.cleaned_data
25                print(dict_Mys_Install)
26                return redirect('Dreaming:mys_tasktab')   ### 提交指向任務列表
27            else:
28                # return HttpResponse("This machine is not under maintenance!!!")
29                return render(request, "Cloud/no_ipaddress.html", {'not_exist_ip': inp_ip})
30        else:
31            return HttpResponse("Sorry! Incorrect information.")
32    else:
33        mys_install_form = MysInstallForm()
34        return render(request, "Cloud/mys_install.html", {'mys_install_form': mys_install_form})


說明
2
models模塊也有本身IP字段,但這裏爲了不更多錯誤嘗試,先直接選用字符串代替。
6-7
20-21
檢驗表單以後,就將install_type和db_type的中文描述傳入zh_ins_tylt數組。
13-15
將post進來的IP看看是否符合這個幾個IP地址。之後改善方向能夠往網段,或者定義哪些可以使用和不可以使用的IP地址。
16-17
在admin管理界面,使用日期排序。    
23,26
表單裏的全部值、install_type、db_type準備就緒後,就能夠保存到數據庫中,並跳轉到任務列表當中。
27,30,34
各類不順利,就讓else函數去報錯和返回吧!



效果展現

05

相關文章
相關標籤/搜索