从零开始搭建django前后端分离项目 系列四(实战之实时进度)

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

实现方式

前端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();
},

 

效果图

 

转载于:https://www.cnblogs.com/dotafeiying/p/9669070.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python+Vue+Django前后端分离项目实战,涉及到使用Python语言编写后端服务,使用Vue框架构建前端界面,并通过Django框架作为API接口实现前后端数据交互的方式。在实战项目中也会涉及到数据库设计和调用、权限控制、文件上传等问题的解决。 ### 回答2: Python、Vue和Django是现在非常流行的前后端开发技术。如果你想学习这些技术,那么前后端分离是一个很好的选择。在这个项目中使用Python作为后端编程语言,Django作为Web框架,Vue作为前端框架。我们可以在这个项目中学习到很多关于前后端分离的经验。 首先,前后端分离可以让我们更好地组织我们的代码。在一个分离的项目中,我们可以通过明确的接口来分离前端和后端。这样一来,我们可以专注于开发代码,而不必担心前后端之间的交互问题。 其次,前后端分离可以使我们更好地实现可重用性。在这个项目中,我们可以编写可重用的Vue组件,并在不同的前端页面中使用它们。同样地,我们也可以编写可重用的Django应用程序,并在不同的后端端点中使用它们。这会使我们的代码更加清晰简洁,也可以提高我们的开发效率。 最后,前后端分离可以让我们更好地实现可维护性。在一个分离的项目中,我们可以更轻松地进行单元测试和端到端测试。这可以帮助我们保持代码的质量,并尽早发现和解决潜在的问题。 总之,Python、Vue和Django前后端分离项目是一个非常好的学习项目。通过这个项目,我们可以从实践中学习如何使用这些技术,并在以后的项目中更好地应用它们。 ### 回答3: Python、Vue和Django是目前非常流行的技术栈之一,其中PythonDjango主要用于后端开发,Vue则是一款流行的前端框架。PythonDjango的优点在于它们易于学习、可扩展性强、社区活跃,并且可以用于构建各种类型的Web应用程序。而Vue的优点在于它简洁、高效、组件化,并且可以很好地配合其他框架和库使用。 前后端分离是一种可以将前端和后端分别开发的方法,这种方法具有很多优点。首先,可以使开发人员更加专注于各自的领域,减少互相干扰和影响。其次,这种方法可以提高应用程序的可维护性和可扩展性。最后,这种方法还可以提高开发效率,使开发人员能够更加高效地开发应用程序。 在前后端分离项目实战中,需要注意以下几点。首先,需要确定应用程序的需求,确定前端和后端的接口规范。其次,需要使用合适的工具和框架来完成前后端的开发任务。对于后端开发,可以使用Django的REST框架,这个框架可以很快地构建RESTful API,并且配合数据库使用。而对于前端开发,则可以使用Vue框架来开发,Vue可以很好地处理数据和UI逻辑。最后,需要着重测试和调试应用程序,确保应用程序的正确性和可用性。 总的来说,Python、Vue和Django是一组非常流行的技术栈,非常适合用于前后端分离项目的开发。在开发前需要确定好需求,选择好工具和框架,开发期间需要注重测试和调试,这样才能开发出高质量的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值