How to use paho mqtt client in django?
我正在编写一个Django应用程序,该应用程序应充当MQTT发布者和订阅者。
我应该在哪里启动paho客户端并运行loop_forever()函数。
应该在wsgi.py中吗?
- loop_forever()将永远阻塞,因此它可能应该在自己的线程中启动
更新:
如果您需要在多个线程中运行Django,然后要从Django应用程序发布消息,则可以使用Paho的"发布"模块中的帮助程序功能-https://eclipse.org/paho/clients/python/docs/#id17
在这种情况下,您无需创建mqtt客户端的实例并启动循环。要订阅某些主题,请考虑将mqtt客户端作为独立脚本运行,并导入Django应用程序所需的模块(并且不要忘记在脚本中设置Django环境)。
仅当您在单个线程中运行Django(在生产环境中并不常见)时,下面的答案才是好的。
在应用程序文件夹中创建mqtt.py,并将所有相关代码放在此处。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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__.py中调用loop_start():
1 2 3
| from . import mqtt
mqtt.client.loop_start() |
使用loop_start()而不是loop_forever()将使您不会阻塞后台线程。
- 谢谢马克斯,一切正常!我还有一个疑问,如果我扩展创建多个mqtt客户端的Web流程,会发生什么?如果是这样,我该如何制止呢?
-
@RajaSudhan"扩展网络流程"是什么意思?
-
在生产环境中运行django应用程序时,我正在使用负载均衡器在多台服务器中进行部署,因此我不想在所有主机中侦听消息。
-
@RajaSudhan好的,现在我了解您的担心。没错,如果您在多个线程中运行Django(通常在生产环境中运行),则不应在每个线程中启动订户,因为在这种情况下,on_message会在每个线程中触发一条消息,但是您希望它开火一次。考虑将mqtt客户端作为独立脚本运行,并导入Django应用程序所需的模块(不要忘记在该脚本中设置Django环境)。
-
@RajaSudhan我之前的评论是关于订阅的。对于从Django进行发布,您可以使用Paho的"发布"模块中的帮助程序功能,请参阅我的答案的更新。
-
可以在./manage.py运行服务器上正常运行,而不能在/ usr / local / bin / uwsgi --socket:7011 --module myproject.wsgi上正常运行。
-
@ user2239318,能否提供更多详细信息?看到异常了吗?您可以共享您的项目代码吗?还要记住,我的答案中的代码仅在您在单个线程中运行Django时才适用,请参阅答案的更新部分。
-
当我这样做时,我实际上在生产环境中运行了3次脚本,有人是否有任何答案_
-
@JavierCampos您运行什么脚本3次?您能否提供更多详细信息?
-
@MaxPolezhaev我是狼人,在设置中我有3个工作,所以脚本运行了3次...可以避免这种情况吗?(当我设置为1个工作程序时,一切正常
-
@JavierCampos您需要一个未导入到Django应用程序中的独立脚本。您将必须使用systemd或您使用的任何脚本执行该脚本(而不是由工人启动3次的Django)。
-
@MaxPolezhaev和我将能够使用django函数在Django db中编写代码?
-
@JavierCampos是的,您将能够在独立脚本中使用Django ORM和所有模型。但是不要忘记在脚本中设置Django环境(请参见stackoverflow.com/a/41266715/6408646)。
-
我遵循了这个问题,但是django服务器停止了,我无法访问localhost:8000。请检查我的问题:stackoverflow.com/questions/66417806 / ...