2016-12-07 231 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應用程序時,我使用負載均衡器部署在多個服務器上,因此我不想在所有主機中收聽消息。 –

相關問題