本项目实现了任务执行的实时进度查询

实现方式

前端websocket + 后端websocket + 后端redis订阅/发布

实现原理

任务执行后,假设用变量num标记任务执行的进度,然后将num发布为订阅的消息保存到redis队列,比如 redis_helper.public('当前任务进度为 %s' %num),django的websocket视图在特定频道订阅消息num并利用websocket协议将消息实时推送到前端,完成前端实时进度展示。

实现代码

redis订阅/发布:

class RedisHelper:
def __init__(self, key):
self.__conn = redis.Redis(host=config.host2, port=config.port2, db=config.db2)
self.chan_sub = key
self.chan_pub= key #发送消息
def public(self,msg):
# logger.info(msg)
self.__conn.publish(self.chan_pub,msg)
return True
#订阅
def subscribe(self):
#打开收音机
pub = self.__conn.pubsub()
#调频道
pub.subscribe(self.chan_sub)
#准备接收
pub.parse_response()
return pub

django视图:

@accept_websocket
def analyze(request):
if not request.is_websocket(): # 判断是不是websocket连接
file_path=request.GET.get('file_path')
file_path_id = request.GET.get('file_path_id')
file=File.objects.get_or_create(id=file_path_id)[0]
jobname=file.name
job = Job(name=jobname,file=file)
job.save()
channel = job.id
result = cluster_analyze_task.delay(channel,file_path,file_path_id)
taskid=result.id
job.task_id=taskid
job.save()
return JsonResponse({'taskid': taskid,'channel': channel},safe=False)
else:
for message in request.websocket:
obj = RedisHelper(message)
redis_sub = obj.subscribe() while True:
msg = redis_sub.parse_response()
msg = msg[2]
request.websocket.send(msg) # 发送消息到客户端
if msg.decode()=='end':
break

前端websocket:

vue的method中增加如下方法:
initWebSocket() { // 初始化weosocket
// ws地址
const wsuri = 'ws://10.39.211.151:8000/app/analyze/';
this.websock = new WebSocket(wsuri);
this.websock.onopen = this.websocketonopen;
this.websock.onmessage = this.websocketonmessage;
this.websock.onclose = this.websocketclose;
},
websocketonmessage(e) { // 数据接收
// console.log(e.data);
},
websocketsend(agentData) { // 数据发送
// 若是ws开启状态
if (this.websock.readyState === this.websock.OPEN) {
this.websock.send(agentData)
}
// 若是 正在开启状态,则等待300毫秒
else if (this.websock.readyState === this.websock.CONNECTING) {
let that = this;// 保存当前对象this
setTimeout(function() {
that.websock.send(agentData)
}, 300);
}
// 若未开启 ,则等待500毫秒
else {
this.initWebSocket();
let that = this;// 保存当前对象this
setTimeout(function() {
that.websock.send(agentData)
}, 500);
}
},
websocketonopen() {
// alert('数据发送中...');
console.log('WebSocket连接成功');
},
websocketclose(e) { // 关闭
console.log('connection closed (' + e.code + ')');
} 在创建时进行初始化
created() {
this.initWebSocket();
},

效果图

从零开始搭建django前后端分离项目 系列四(实战之实时进度)的更多相关文章

  1. 从零开始搭建django前后端分离项目 系列一(技术选型)

    前言 最近公司要求基于公司的hadoop平台做一个关于电信移动网络的数据分析平台,整个项目需求大体分为四大功能模块:数据挖掘分析.报表数据查询.GIS地理化展示.任务监控管理.由于页面功能较复杂,所以 ...

  2. 从零开始搭建django前后端分离项目 系列三(实战之异步任务执行)

    前面已经将项目环境搭建好了,下面进入实战环节.这里挑选项目中涉及到的几个重要的功能模块进行讲解. celery执行异步任务和任务管理 Celery 是一个专注于实时处理和任务调度的分布式任务队列.由于 ...

  3. 从零开始搭建django前后端分离项目 系列二(项目搭建)

    在开始项目之前,假设你已了解以下知识:webpack配置.vue.js.django.这里不会教你webpack的基本配置.热更新是什么,也不会告诉你如何开始一个django项目,有需求的请百度,相关 ...

  4. 从零开始搭建django前后端分离项目 系列六(实战之聚类分析)

    项目需求 本项目从impala获取到的数据为用户地理位置数据,每小时的数据量大概在8000万条,数据格式如下: 公司要求对这些用户按照聚集程度进行划分,将300米范围内用户数大于200的用户划分为一个 ...

  5. 从零开始搭建django前后端分离项目 系列五(实战之excel流式导出)

    项目中有一处功能需求是:需要在历史数据查询页面进行查询字段的选择,然后由后台数据库动态生成对应的excel表格并下载到本地. 如果文件较小,解决办法是先将要传送的内容全生成在内存中,然后再一次性传入R ...

  6. Django前后端分离项目部署

    vue+drf的前后端分离部署笔记 前端部署过程 端口划分: vue+nginx的端口 是81 vue向后台发请求,首先发给的是代理服务器,这里模拟是nginx的 9000 drf后台运行在 9005 ...

  7. luffy项目搭建流程(Django前后端分离项目范本)

    第一阶段: 1.版本控制器:Git      2.pip安装源换国内源    3.虚拟环境搭建        4.后台:Django项目创建 5.数据库配置              6.luffy前 ...

  8. nginx+vue+uwsgi+django的前后端分离项目部署

    Vue+Django前后端分离项目部署,nginx默认端口80,数据提交监听端口9000,反向代理(uwsgi配置)端口9999 1.下载项目文件(统一在/opt/luffyproject目录) (1 ...

  9. List多个字段标识过滤 IIS发布.net core mvc web站点 ASP.NET Core 实战:构建带有版本控制的 API 接口 ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目 Using AutoFac

    List多个字段标识过滤 class Program{  public static void Main(string[] args) { List<T> list = new List& ...

随机推荐

  1. Nodejs全局/缓存路径配置

    $ npm config set prefix "D:\Program Files\nodejs\node_global" $ npm config set cache " ...

  2. 【极简】如何挑选合适的百度BCC,并安装宝塔控制面板

    1.前期有百度云账号,登陆系统控制台,点击产品"云服务器BCC". 2.关闭绑定快照策略,选择购买弹性公网IP,如果选择不需要,服务器就没有对外的IP,只能在内网内使用,所以这里要 ...

  3. Hibernate概念初探

    概述 Hibernate是一个开源代码的对象关系映射(ORM)框架,是基于Java的持久化中间件,它对JDBC进行轻量级的对象封装. 它不仅提供了从Java类到数据表之间的映射,也提供了查询和事务机制 ...

  4. 运营商专线服务的基本原理(BGP传递私网路由)

  5. OpenCV 4.0.1 找不到R.styleable解决

    OpenCV 4.0.1作为模块导入Android Studio会有找不到R.styleable的问题. 解决方法 1.导入模块前 将 opencv-4.0.1-android-sdk\OpenCV- ...

  6. git多个远程仓库

    1. 前言   用GitHub管理自己的开源项目有几年了,最近一年更新得比较多,仓库也越来越多越来越大.有时候感觉GitHub太慢,尤其是最近感觉更为明显,于是萌生了再找个国内类似GitHub的代码托 ...

  7. CentOS基本的命令与快捷建

    由于我的计算机在安装linux系统时,计算机出现了问题,并没有安装ubuntu而是安装的centos.虽然两者属于linux的不同版本,但是在具体的操作上大同小异.在学习linux的各种指令和快捷键的 ...

  8. MySQL并行复制的一个坑

    早上巡检数据库,发现一个延迟从库的sql_thread中断了. Last_SQL_Errno: 1755 Last_SQL_Error: Cannot execute the current even ...

  9. ASP.NET系统对象

    一.ASP.NET 系统对象        Request:用来获取客户端在Web请求期间发送的值,如URL参数,表单参数        Response:用来负者返回到客户端的HTTP输出      ...

  10. Linux 小知识翻译 - 「DNS服务器」

    这次聊聊「DNS服务器」. DNS(Domain Name System)服务器,也被称为域名服务器. 因为使用互联网的时候,必须要指定DNS服务器,所以你一定听过DNS这个名字吧. 那么,这个DNS ...