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掉

*****会把原先的删除****,更新为新的

 

posted @ 2018-06-23 14:56  番茄土豆西红柿  阅读(109)  评论(0)    收藏  举报
TOP