我正在做一个使用Django和MQTT的项目。有一种情况,当我的Django Web服务器由于某种原因断开连接后重新连接到代理时,我想重新订阅与数据库中的模型有关的所有主题。我的模型室如下:
class Room(models.Model):
building = models.ForeignKey(Building, on_delete= models.CASCADE)
number = models.PositiveIntegerField()
available = models.BooleanField(default=True)
power = models.BooleanField(default=False)
class Meta:
ordering = ['building', 'number']
unique_together = ['building', 'number']
def __str__(self):
return f"{self.building.bid}/{self.number}"
def get_mqtt_topic(self):
return f"{self.building.bid}/{self.number}"
方法get_mqtt_topic()将返回与房间关联的MQTT主题。 MQTT客户端代码mqtt / client.py:
import paho.mqtt.client as mqtt
from .tasks import *
from .models import Room
def on_connect(client, userdata, flags, rc):
print("Connecting to CloudMQTT broker: "+ mqtt.connack_string(rc))
room_mqtt = [(room.get_mqtt_topic(), 1) for room in Room.objects.all()]
client.subscribe(room_mqtt)
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
因为我将下面的代码放在 init .py中,以便在与django应用程序不同的线程中运行mqtt客户端。
from mqtt.client import client
client.loop_start()
所以我得到了这个错误:django.core.exceptions.AppRegistryNotReady:应用尚未加载。
答案 0 :(得分:0)
我有同样的错误,我的临时解决方案是在on_connect方法中导入。
import paho.mqtt.client as mqtt
from .tasks import *
def on_connect(client, userdata, flags, rc):
from .models import Room
print("Connecting to CloudMQTT broker: "+ mqtt.connack_string(rc))
room_mqtt = [(room.get_mqtt_topic(), 1) for room in Room.objects.all()]
client.subscribe(room_mqtt)
client = mqtt.Client()
client.on_connect = on_connect