2016-12-07 4 views
4

Ich schreibe eine Django-Anwendung, die als MQTT-Publisher und als Abonnent fungieren soll.Wie paho mqtt Client in Django verwenden?

Wo soll ich den Paho-Client starten und loop_forever() -Funktion ausführen.

Sollte es in wsgi.py sein?

+0

'loop_forever()' wird für immer blockieren, so sollte es wahrscheinlich in seinem eigenen Thread gestartet werden – hardillb

Antwort

5

Update:

Wenn Sie Django dann in mehrere Threads laufen zu veröffentlichen Nachrichten von Ihrem Django App können Sie Hilfsfunktionen von Publish-Modul von Paho verwenden - https://eclipse.org/paho/clients/python/docs/#id17 Sie müssen keine Instanz erstellen von mqtt Client und starten Sie in diesem Fall eine Schleife. Um ein Thema zu abonnieren, sollten Sie mqtt client als eigenständiges Skript ausführen und dort die benötigten Module Ihrer Django-App importieren (und vergessen Sie nicht, die Django-Umgebung im Skript einzurichten).


Die Antwort unten ist nur gut, wenn man Django in einem einzigen Thread ausgeführt werden, die in der Produktion nicht üblich ist.

Erstellen Sie mqtt.py in Ihrem Anwendungsordner und legen Sie alle zugehörigen Code dort. Zum Beispiel:

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) 

Sie loop_forever() hier nicht nennen!

dann in Ihrer Anwendung __init__.py Anruf loop_start():

from . import mqtt 

mqtt.client.loop_start() 

Mit loop_start() statt loop_forever() geben Sie Hintergrund-Thread nicht blockieren.

+0

Danke Max, funktioniert gut !! Ich habe noch einen weiteren Zweifel, was passiert, wenn ich den Web-Prozess skaliere, erstellt das mehrere mqtt-Clients? Wenn ja, wie halte ich das an? –

+0

@RajaSudhan Was meinen Sie mit "den Webprozess skalieren"? –

+0

Während ich die django-Anwendung in der Produktion benutze, binde ich auf mehreren Servern mit Load-Balancer, daher möchte ich keine Nachrichten in allen Hosts hören. –

Verwandte Themen