通过 Celery 任务来处理异步消息传递并将结果传递回 Django 视图

一、定义 Celery 任务来处理消息:

   创建一个 Celery 任务,将回调函数接收到的数据存储在某个共享的存储(如数据库、缓存等)中,或者通过其他方式传递数据。

# tasks.py

//引入celery
from celery import shared_task

from .models import ReceivedData  //假设有一个模型来存储接收到的数据

@shared_task

def process_message(frame_body):

    if frame_body is not None:

        temperature, student_id = frame_body.split("-")

        temperature = float(temperature)

        //保存数据到数据库或其他存储中

        ReceivedData.objects.create(student_id=student_id, temperature=temperature)

        return student_id, temperature

    else:

        return None, None

```

二、修改回调函数以触发 Celery 任务:

   在回调函数中,触发 Celery 任务并传递消息内容。

三、在 Django 视图中获取任务结果:

   修改视图以等待并获取 Celery 任务的结果。等待任务结果是一个同步操作,如果任务执行时间较长,可能会阻塞视图的执行。


 

# views.py

from django.shortcuts import render

from .tasks import process_message

from .models import ReceivedData



def lianjie(request):

    condata = MyListener(conn)

    # 查询数据库中最新的记录

    latest_data = ReceivedData.objects.latest('id')

    if latest_data:

        temperature, student_id = latest_data.temperature, latest_data.student_id

        print(temperature, student_id)

        return render(request, 'your_template.html', {'temperature': temperature, 'student_id': student_id})

    else:

        return render(request, 'your_template.html', {'error': 'No data received yet'})

```

四、重要注意事项:

1. 数据库模型(例如 `ReceivedData`)应提前定义:

   # models.py

   from django.db import models

   class ReceivedData(models.Model):

       student_id = models.CharField(max_length=100)

       temperature = models.FloatField()

       timestamp = models.DateTimeField(auto_now_add=True)

2. **确保 Celery 正常运行:**

  

   配置并启动 Celery worker,以便处理异步任务。

3. **触发回调函数:**

  

   确保 `MyListener` 的 `on_message` 方法能被正确触发。通常,回调函数在某些事件(如消息到达)时自动触发。

利用 Celery 处理异步任务,并通过数据库或其他持久存储共享数据,可以在 Django 视图中获取和使用这些数据。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值