首页 > 解决方案 > Flask 客户端在 uWSGI 后面运行时未收到 MQTT 消息

问题描述

我有一个 Flask 应用程序,它通过 mosquitto 代理(v 1.6.4)订阅 MQTT 主题。直接运行时(使用 Flask 自己的服务器),客户端连接、订阅和接收消息。当应用程序由 uWSGI 服务器 (v 2.0.17) 提供服务时,客户端连接、订阅但不接收消息。

两种场景的客户端日志如下。只有在第一种情况下才收到消息。

使用 Flask 自己的服务器运行时:

蟒蛇项目.py

发送 CONNECT (u1, p1, wr0, wq0, wf0, c1, k60) client_id=b'full-client-54'

收到 CONNACK (0, 0)

发送 SUBSCRIBE (d0, m1) [(b'/topics/drone/battery', 0)]

收到 SUBACK

收到 PUBLISH (d0, q0, r0, m0), '/topics/drone/battery', ... (76 bytes)

使用 uWSGI 运行时:

uwsgi --socket 0.0.0.0:8080 --protocol=http -w project:app -H env --workers 1

发送 CONNECT (u1, p1, wr0, wq0, wf0, c1, k60) client_id=b'full-client-54'

收到 CONNACK (0, 0)

发送 SUBSCRIBE (d0, m1) [(b'/topics/drone/battery', 0)]

收到 SUBACK

客户端代码如下:

import paho.mqtt.client as mqtt
import flask
import json


app = flask.Flask(__name__)


def  on_connect(client, userdata, flags, rc):
   client.subscribe(BATTERY_TOPIC)


def on_message(client, userdata, msg):
   data = json.loads(msg.payload)

   # custom code


def on_log(client, userdata, level, buf):
        print(buf)


client = mqtt.Client('full-client-54')
client.on_connect = on_connect
client.on_message = on_message
client.username_pw_set(username=USER_NAME, password=PWD)
client.on_log=on_log


try:
   client.connect(BROKER_IP)
   client.loop_start()
except Exception: 
   print('Exception when connecting to mqtt broker')

有谁知道为什么使用此设置,当 MQTT 客户端由 uWSGI 提供服务时,无法正确接收消息?

标签: flaskmqttuwsgi

解决方案


你也一样。解决方案是将uwsgi更改为gunicorn,它工作正常。


推荐阅读