62 - 发布系统
demo-doing1
目录结构

flask蓝图的代码结构,其中用了sqlaclemy的操作,下面展示两个py文件的内容,其余参考附件源码
project.py
#!/usr/bin/python
# -*- coding:utf-8 -*-
from flask import Blueprint,render_template,request,redirect,url_for
from deploy import db
from deploy import models
from deploy.forms.project import ProjectAddForm
project = Blueprint('project',__name__)
@project.route('/project/list')
def project_list():
pro_list = db.session.query(models.Project).all()
# for row in pro_list:
# print(row.id,row.title,row.hosts)
# 使用sqlalchemy连表操作
# hosts = db.session.query(models.Project2Host.host_id,models.Host.hostname).join(models.Host,models.Project2Host.host_id==models.Host.id,isouter=True).filter(models.Project2Host.project_id==row.id).all()
# print(row.id,row.title,hosts)
return render_template('project_list.html',pro_list=pro_list)
@project.route('/project/add',methods=['GET','POST'])
def project_add():
if request.method == 'GET':
form = ProjectAddForm()
return render_template('project_add.html',form=form)
form = ProjectAddForm(formdata=request.form)
if form.validate():
"""
1.创建项目 models.Project
2.创建关系
"""
# models.Project(name='test',title="test",repository='test')
# obj = models.Project(**{"name":'test','title':"test",'repository':'test'})
# 方式一:
"""
data_dict = form.data
host_id_list = data_dict.pop('hosts')
obj = models.Project(**data_dict)
db.session.add(obj)
db.session.commit()
p2h_list = []
for host_id in host_id_list:
p2h_list.append(models.Project2Host(host_id=host_id,project_id=obj.id))
db.session.add_all(p2h_list)
db.session.commit()
"""
# 方式二:
data_dict = form.data
host_id_list = data_dict.pop('hosts') # 因为库中没有hosts这个字段,所以要先pop掉
host_object_list = db.session.query(models.Host).filter(models.Host.id.in_(host_id_list)).all()
obj = models.Project(**data_dict)
obj.hosts = host_object_list
db.session.add(obj)
db.session.commit()
db.session.remove()
# return redirect('/project/list')
return redirect(url_for('project.project_list'))
return render_template('project_add.html', form=form)
@project.route('/project/edit/<int:nid>',methods=['GET','POST'])
def project_edit(nid):
if request.method == "GET":
proj = db.session.query(models.Project).filter(models.Project.id == nid).first()
# proj.xhosts = [ item.id for item in proj.hosts]
# form = ProjectAddForm(obj=proj)
# wtforms传默认值
# data= 字典
# obj= 对象
form = ProjectAddForm(data={'name':proj.name,'title':proj.title,'repository':proj.repository,'hosts':[ item.id for item in proj.hosts]})
return render_template('project_edit.html',form=form)
form = ProjectAddForm(formdata=request.form)
if form.validate():
form_dict = form.data
host_id_list = form_dict.pop('hosts') # 因为库中没有hosts这个字段,所以要先pop掉
db.session.query(models.Project).filter(models.Project.id == nid).update(form_dict)
obj = db.session.query(models.Project).filter(models.Project.id == nid).first()
host_object_list = db.session.query(models.Host).filter(models.Host.id.in_(host_id_list)).all()
obj.hosts = host_object_list
db.session.add(obj)
db.session.commit()
db.session.remove()
# *****会把原先的删除****,更新为新的
return redirect(url_for('project.project_list'))
return render_template('project_edit.html', form=form)
publisher.py
#!/usr/bin/python
# -*- coding:utf-8 -*-
import os
import time
from flask import Blueprint,render_template,request,redirect,url_for,current_app
from deploy import db
from deploy import models
publisher = Blueprint('publisher',__name__)
@publisher.route('/pub/list/<int:pid>')
def pub_list(pid):
deploy_list = db.session.query(models.Deploy).filter(models.Deploy.project_id==pid).all()
return render_template('pub_list.html',deploy_list=deploy_list)
@publisher.route('/pub/deploy/<int:did>')
def pub_deploy(did):
deploy_object = db.session.query(models.Deploy).filter(models.Deploy.id==did).first()
ctime = str(int(time.time()))
project_path = os.path.join(current_app.config['DEPLOY_BASE_PATH'],deploy_object.proj.name,ctime)
print(project_path)
# 1. 拉代码
# import subprocess
# if not os.path.exists(project_path):
# os.makedirs(project_path)
# git_cmd = "git clone -b %s %s" %(deploy_object.version,deploy_object.proj.repository,)
# subprocess.check_output(git_cmd,cwd=project_path,shell=True)
# 2. 编译
# subprocess.check_output('java --b asdfsdf', cwd=project_path,shell=True)
# 3. 指定目录文件
import shutil
shutil.make_archive(r'D:\m1\deploy_new\codes\x1', format='zip', root_dir=r'D:\m1\deploy_new\deploy\forms')
# 4. 两种
# ############ 主动推送 ############
# scp
"""
from salt.client.ssh.client import SSHClient
client = SSHClient()
# salt:// => /srv/salt
client.cmd('*', 'cp.get_file', ('salt://fengfeng/files/test.conf', '/data/s1111111.conf'))
"""
# master
"""
import salt.client
local = salt.client.LocalClient()
local.cmd('*', 'cp.get_file', ('salt://fengfeng/files/test.conf', '/data/s1.conf'))
"""
# ############ 客户端拉取 ############
# 1. 将x1.zip文件上传到FTP、HTTP
# import requests
# requests.post(
# url='http服务器地址',
# file={'x1.zip': open('D:\m1\deploy_new\codes\x1.zip', 'rb')}
# )
# 2. 通知所有客户端去下载
"""
# 通过SSH发送命令
from salt.client.ssh.client import SSHClient
client = SSHClient()
# salt:// => /srv/salt
client.cmd('*', 'cp.get_url', ('http://www.pythonav.com/allstatic/imgs/mv/picture/2.jpeg', '/data/s1.jpeg'))
# 通过RPC发送命令
import salt.client
client = salt.client.LocalClient()
client.cmd('*', 'cp.get_url', ('http://www.pythonav.com/allstatic/imgs/mv/picture/2.jpeg', '/data/s1.jpeg'))
"""
# 5. 上传脚本
# 备份
# 重启
return "pub_deploy"
课堂笔记
知识点:
一、relationship【可以用于many2many和foreignkey】
1,自动创建对象以及和对象关联的对象
2,创建关联关系
另外一种用法
1,只创建对象,但是不添加和对象关联的对象
2,创建关联关系
wtforms传默认值
data=
obj=
edit
host_id_list = form_dict.pop('hosts') 是因为库中没有hosts这个字段,所以要先pop掉
*****会把原先的删除****,更新为新的
做有积累的事~~

浙公网安备 33010602011771号