一、定义 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 视图中获取和使用这些数据。