正文開始:
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"> 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"> 業務簡稱 </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緩存 (MB) ">
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