2016-12-07 199 views
4

我正在写一个应该作为MQTT发布者和用户的django应用程序。如何在django中使用paho mqtt客户端?

我应该在哪里启动paho客户端并运行loop_forever()函数。

它应该在wsgi.py中吗?

+0

'loop_forever()'将永远阻塞,所以它应该可能启动它自己的线程 – hardillb

回答

5

更新:

如果您需要在Django的多个线程运行,那么发布您的Django应用程序可以使用辅助功能从发布泛美卫生组织的模块信息 - https://eclipse.org/paho/clients/python/docs/#id17 你并不需要创建一个实例的mqtt客户端,并在这种情况下启动一个循环。要订阅某个主题,请考虑将mqtt客户端作为独立脚本运行,并在其中导入需要的Django应用程序模块(并且不要忘记在脚本中设置Django环境)。只有当你在一个单独的线程,这是不是在平时的生产运行的Django


回答下面是好的。

在您的应用程序文件夹中创建mqtt.py并将所有相关代码放在那里。例如:

import paho.mqtt.client as mqtt 

def on_connect(client, userdata, rc): 
    client.subscribe("$SYS/#") 

def on_message(client, userdata, msg): 
    # Do something 
    pass 

client = mqtt.Client() 
client.on_connect = on_connect 
client.on_message = on_message 

client.connect("iot.eclipse.org", 1883, 60) 

别叫loop_forever()在这里!

然后在你的应用程序调用__init__.pyloop_start()

from . import mqtt 

mqtt.client.loop_start() 

使用的loop_start()代替loop_forever()会给你不堵后台线程。

+0

谢谢Max,工作正常!我还有一个疑问,如果我扩展web进程,创建多个mqtt客户端会发生什么? 如果是这样,我该如何阻止? –

+0

@RajaSudhan你是什么意思“规模的网络进程”? –

+0

在生产环境中运行django应用程序时,我使用负载均衡器部署在多个服务器上,因此我不想在所有主机中收听消息。 –

相关问题