# @Time : 2022/6/4 9:22
# @Author : kongsh
# @File : consumers.py
import json
import time
import threading
import os
import subprocess
import shutil
import traceback
from channels.generic.websocket import WebsocketConsumer
from channels.exceptions import StopConsumer
from asgiref.sync import async_to_sync
from django.conf import settings
from web import models
from utils.git_util import GitRepository
from utils.ssh import SSHProxy
consumer_object_list = []
def get_node(task_obj, task_id):
"""返回节点数据"""
node_obj_list = []
queryset = models.Node.objects.filter(task_id=task_id)
if queryset:
return queryset
# 没有的话在数据库创建节点
start_node = models.Node.objects.create(text="开始", task_id=task_id)
node_obj_list.append(start_node)
# 判断第1个钩子是否有自定义脚本:任务单对象.before_download_script
if task_obj.before_download_script:
start_node = models.Node.objects.create(text='下载前', task_id=task_id, parent=start_node)
node_obj_list.append(start_node)
download_node = models.Node.objects.create(text="下载", task_id=task_id, parent=start_node)
node_obj_list.append(download_node)
# 判断第2个钩子是否有自定义脚本:任务单对象.after_download_script
if task_obj.after_download_script:
download_node = models.Node.objects.create(text='下载后', task_id=task_id, parent=download_node)
node_obj_list.append(download_node)
upload_node = models.Node.objects.create(text="上传", task_id=task_id, parent=download_node)
node_obj_list.append(upload_node)
task_obj = models.Deploy.objects.filter(id=task_id).first()
for server_obj in task_obj.project.servers.all():
row = models.Node.objects.create(text=server_obj.hostname,
task_id=task_id,
parent=upload_node,
server=server_obj)
node_obj_list.append(row)
# 判断是否有发布前钩子
if task_obj.before_deploy_script:
row = models.Node.objects.create(text="发布前",
task_id=task_id,
parent=row,
server=server_obj)
node_obj_list.append(row)
deploy_node = models.Node.objects.create(text="发布",
task_id=task_id,
parent=row,
server=server_obj)
node_obj_list.append(deploy_node)
# 判断是否有发布后钩子
if task_obj.after_deploy_script:
row = models.Node.objects.create(text="发布后",
task_id=task_id,
parent=deploy_node,
server=server_obj)
node_obj_list.append(row)
return node_obj_list
def convert_obj_to_gojs(node_obj_list):
"""将对象列表转换为gojs识别的json格式"""
node_list = []
for node in node_obj_list:
tmp = {
'key': str(node.id),
'text': node.text,
'color': node.status,
'stroke': 'white',
}
if node.parent:
tmp['parent'] = str(node.parent.id)
node_list.append(tmp)
return node_list
class PublishConsumer(WebsocketConsumer):
def websocket_connect(self, message):
"""
请求websocket链接时自动触发
:param message:
:return:
"""
# 与客户端建立链接
self.accept()
# 将自己加入到task_id群里,接收以后发来的消息
# 【固定写法】获取url中传递的参数,如果url中定义的是关键字参数,就用kwargs,否则就用args
task_id = self.scope['url_route']['kwargs'].get('task_id')
async_to_sync(self.channel_layer.group_add)(task_id, self.channel_name)
# 用户打开页面时,如果已经创建好节点则直接返回
queryset = models.Node.objects.filter(task_id=task_id)
if queryset:
node_list = convert_obj_to_gojs(queryset)
self.send(text_data=json.dumps({'code': 'init', 'data': node_list}))
def websocket_receive(self, message):
"""
客户端发送消息时自动触发
:param message:
:return:
"""
# print("客户端消息:", message)
task_id = self.scope['url_route']['kwargs'].get('task_id')
task_obj = models.Deploy.objects.filter(id=task_id).first()
text = message.get('text')
if text == 'init':
# node_list = [
# {'key': "start", 'text': '开始', 'figure': 'Ellipse'},
# {'key': "download", 'parent': 'start', 'text': '下载代码', 'link_text': '执行中...'},
# {'key': "compile", 'parent': 'download', 'text': '本地编译'},
# ]
# 第1步:数据库没有的话先创建节点,有的话直接读取
node_obj_list = get_node(task_obj, task_id)
# 第2步:根据对象列表封装好指定格式数据,以json格式返回给gojs
node_list = convert_obj_to_gojs(node_obj_list)
# self.send(text_data=json.dumps({'code': 'init', 'data': node_list}))
# 第1个参数是群号;
# 第2个参数是给这个群内的每个用户发送消息的函数;
# 第3个参数是发送的消息
async_to_sync(self.channel_layer.group_send)(task_id,
{'type': 'xxx.yyy',
'message': {'code': 'init', 'data': node_list}})
if text == 'deploy':
# 代码发布
# channels的缺陷,有sleep的时候,颜色在最后统一展示,不能逐个展示,需要将执行函数放到另外一个线程
task = threading.Thread(target=self.deploy, args=(task_id, task_obj))
task.start()
def xxx_yyy(self, event):
"""发送消息函数,会给每个用户都发送message字段中的内容"""
message = event['message']
self.send(json.dumps(message))
def websocket_disconnect(self, message):
"""断开websocket链接时触发"""
task_id = self.scope['url_route']['kwargs'].get('task_id')
# 群聊里剔除离开的用户,self.channel_name相当于给每个人创建的唯一id
async_to_sync(self.channel_layer.group_discard)(task_id, self.channel_name)
raise StopConsumer()
def _change_node_status(self, text, task_id, server=None, color='green'):
"""
修改指定节点的状态和颜色
:param text:
:param server:主机
:param task_id:
:param color:修改后的颜色
:return:
"""
if server:
node = models.Node.objects.filter(text=text, task_id=task_id, server=server).first()
else:
node = models.Node.objects.filter(text=text, task_id=task_id).first()
node.status = color
node.save()
# 群发
async_to_sync(self.channel_layer.group_send)(task_id,
{'type': 'xxx.yyy',
'message': {'code': 'update', 'node_id': node.id,
'color': node.status}})
def _send_log(self, task_id, info):
"""实时输出日志信息"""
# 群发
async_to_sync(self.channel_layer.group_send)(task_id,
{'type': 'xxx.yyy',
'me
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【资源说明】 python毕业设计-基于Django+channels+gojs实现的代码发布系统设计与实现+使用说明.zippython毕业设计-基于Django+channels+gojs实现的代码发布系统设计与实现+使用说明.zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕设项目、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 3、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
资源推荐
资源详情
资源评论
收起资源包目录
python毕业设计-基于Django+channels+gojs实现的代码发布系统设计与实现+使用说明.zip (65个子文件)
deployProject-master
db.sqlite3 192KB
app01
__init__.py 0B
migrations
__init__.py 0B
apps.py 85B
models.py 57B
consumers.py 1KB
urls.py 296B
views.py 1KB
utils
__init__.py 70B
git_util.py 3KB
ssh.py 2KB
web
__init__.py 0B
forms
__init__.py 70B
server.py 7KB
tests.py 60B
admin.py 63B
migrations
__init__.py 0B
0001_initial.py 515B
0006_node.py 1KB
0005_hooktemplate.py 772B
0003_auto_20220611_1058.py 656B
0002_project.py 774B
0004_deploy.py 1KB
apps.py 81B
models.py 3KB
consumers.py 15KB
templates
server_list.html 4KB
project_list.html 3KB
layout.html 2KB
form.html 821B
task_list.html 2KB
deploy.html 6KB
task_form.html 15KB
views
__init__.py 70B
deploy.py 2KB
project.py 2KB
server.py 2KB
views.py 63B
readme 3KB
templates
home.html 2KB
web.html 1KB
index.html 959B
gojsDemo.html 4KB
.idea
dataSources
472d9ddd-6281-4708-9df5-976ff9c571ab.xml 66KB
deployProject.iml 1KB
vcs.xml 2KB
misc.xml 185B
dataSources.xml 525B
inspectionProfiles
Project_Default.xml 370B
profiles_settings.xml 174B
modules.xml 278B
.gitignore 236B
server.py 3KB
manage.py 669B
package
zion
zion-prod-v1-20220619191256.zip.zip 31KB
identifier.sqlite 0B
deployProject
__init__.py 0B
wsgi.py 403B
urls.py 2KB
settings.py 4KB
routing.py 491B
asgi.py 624B
static
js
go.js 897KB
Figures.js 262KB
171265889347208773632.zip 416B
共 65 条
- 1
资源评论
不走小道
- 粉丝: 3197
- 资源: 4313
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 卡方数据.sav
- Python实现基于Django框架的二手物品购物网站设计源码+数据库.zip
- 基于Python和Django的二手物品购物网站设计源码+数据库脚本.zip
- 【计算机毕业设计】基于h5的移动网赚项目小程序【源码+lw+部署文档+讲解】
- 【计算机毕业设计】基于ssm-vue的oa系统设计与实现【源码+lw+部署文档+讲解】
- 基于pytorch实现的YOLOV5+SORT的车辆行人目标识别及追踪系统源码.zip
- 【计算机毕业设计】基于servlet+jdbc的在线选房系统设计与实现【源码+lw+部署文档+讲解】
- 投身科技创新,勇担时代先锋.pptx
- 【计算机毕业设计】基于SSM的仿微博系统的设计与实现【源码+lw+部署文档+讲解】
- 使用 Web Components 实现,遵循 Material You 设计规范的 Web 前端组件库
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功