Django制作前端页面生成yaml文件

整体流程与环境说明

整体流程如下图,请感受灵魂画师的功力:
paradin

Django:2.1.1,阿里云服务器
Python:3.6.4,安装方法见:https://rorschachchan.github.io/2018/07/31/获取网站title的脚本/

Django启动

由于是python3,所以直接pip install django就安装最新的Django版本。

1
2
3
4
5
django-admin startproject Kubernetes		#如果提示django-admin命令不存在可以做一个软连接到/usr/local/bin/目录下
cd Kubernetes
python manage.py startapp createyaml #创建APP
python manage.py migrate
python manage.py createsuperuser

app创建完毕之后,在Kubernetes/settings.pyINSTALLED_APPS字段添加createyaml,此时就创建好了项目和app。python manage.py runserver 0.0.0.0:8000启动django,然后浏览器地址栏输入外网IP:8000,就会看到django正常启动了,如图:
paradin

Django准备

首先我们先准备一个脚本111.sh,这个脚本很简单,就是接收到前端传入的数值然后加工成一个yaml文件,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
#用来生成对应的yaml文件
cat << EOF
=============================
=== HERE IS YOUR YAML ===
=============================
EOF

echo apiVersion: v1
echo kind: $1
echo metadata:
echo name: $2
echo labels:
echo app: web
echo spec:
echo containers:
echo -- name: front-end
echo image: $5
echo ports:
echo -- containerPort: $3
echo -- name: rss-reader
echo image: nickchase/rss-php-nginx:v1
echo ports:
echo - containerPort: $4

可以看出上面这个生成yaml脚本太粗糙了,很多地方还有待改进,但是这仅仅是一个小例子而已。再去/django/Kubernetes/createyaml/templates里准备一个比较简单的前端页面脚本,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>创建yaml文件</title>
</head>
<body>
<h1>创建YAML文件用于K8s部署</h1>
<h2>请根据实际情况填写以下内容</h2>
<form method="post" action="/create_yaml/">
<input type="text" name="kind" placeholder="类型"><br>
<input type="text" name="name" placeholder="名称"><br>
<input type="text" name="containerPort1" placeholder="容器端口1"><br>
<input type="text" name="containerPort2" placeholder="容器端口2"><br>
<input type="text" name="mirror" placeholder="镜像"><br>
{{ error }}<br>
<button id="btn" type="submit">生成yaml</button>
{% csrf_token %}
<!-- 标签添加CSRF令牌,这是因为django针对CSRF(跨站请求伪造)有保护措施,没有这句话就是403 --!>
</form>
</body>
</html>

有了页面,还需要一个域名指向这个页面,修改一下/django/Kubernetes/Kubernetes/urls.py,改成如下:

1
2
3
4
5
6
7
8
from django.contrib import admin
from django.urls import path
from createyaml import views #将createyaml这个app的views引进

urlpatterns = [
path('admin/', admin.site.urls),
path(r'create_yaml/', views.create_yaml), #新版的这里不再是url了,把这个url指向views.py里的create_yaml函数
]

再继续,写一下views.py里的create_yaml函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import subprocess		#引入这个库

#创建yaml
def create_yaml(request):
if request.method == 'POST':
kind = request.POST.get('kind', '') #后面的''是默认值的意思
name = request.POST.get('name', '')
containerPort1 = request.POST.get('containerPort1', '')
containerPort2 = request.POST.get('containerPort2', '')
mirror = request.POST.get('mirror', '')
result = subprocess.Popen(args=['bash','/docker/111.sh',name,mirror,containerPort1,containerPort2],stdout = subprocess.PIPE,shell = False).stdout.read() #在这里通过subprocess去启动111.sh这个脚本
return HttpResponse(result,content_type="text/plain")
else:
return render(request,'createyaml.html')

以上函数多说几句:

  1. 首先判断请求的方法是否是POST,不是的话返回该页面;
  2. request.POST.get方法获取前端传入的名称或者端口等值,此处的kindnamemirrorcontainerPort就是html文件里form表单部分那两个input标签的name属性;
  3. 获取到了变量,然后就让subprocess来调用111.sh来用这些变量去运行脚本,执行的结果就是result,然后return这个result结果;
  4. 使用subprocess最好不打开shell = True,因为这样的话,要是不小心rm -rf /,你就gg了,但是如果shell = False的话,就会把刚才的命令看成rm-rf /两部分,也就是不能成功,这样也免去了别人恶意注入的危险;

实际操作效果

akb48

参考资料

https://blog.csdn.net/xiaoyaozizai017/article/details/72794469
http://lipeilipei.top/2018/02/07/python+django%E5%AE%9E%E7%8E%B0%E7%99%BB%E9%99%86%E5%8A%9F%E8%83%BD%EF%BC%88%E4%B8%8B%E7%AF%87%EF%BC%89/
https://blog.csdn.net/bjbz_cxy/article/details/79358718 (如果不想用django就可以看看这个cgi方法)
http://blog.51cto.com/laomomo/2163399

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------