flask - 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 提供服务时,无法正确接收消息?
解决方案
你也一样。解决方案是将uwsgi更改为gunicorn,它工作正常。
推荐阅读
- inheritance - 没有方法的子接口
- java - 为什么使用相同的时区获得不同的 localDate
- ruby-on-rails - 如何在 ruby 的 link_to 中添加 tabindex
- mobile - 通过移动应用更改 Google 表格时,“编辑”触发器未激活
- iis - 如何在 IIS 上发布 Polymer 2/3 项目?
- bash - 为什么 bash(来自 git 安装)突然给我分段错误?
- android - 抓取 Google Play 商店应用
- python - Python3中的整数溢出
- php - 成千上万的插入,我有重复的值,为什么?
- inheritance - 覆盖上层类的变量