【发布时间】:2021-09-24 01:36:20
【问题描述】:
在启动烧瓶、mqtt 和 socketio 应用程序时,我如何在应用程序启动时但在浏览器首次连接之前订阅主题?
我曾假设我可以使用before_first_request,但它只在第一次请求时被调用,还假设我可以使用mqtt.on_connect,但在使用套接字 io 时以及如果我在__main__ 启动应用程序之前订阅,则不会调用然后我订阅了两个线程而不是一个。
#!/usr/bin/env python3
import json
from flask import Flask, render_template
from flask_mqtt import Mqtt
from flask_socketio import SocketIO
from flask_bootstrap import Bootstrap
# Flask App
app = Flask(__name__)
app.config['MQTT_BROKER_URL'] = '192.168.109.135'
print('Configured MQTT IP Address: ' + app.config['MQTT_BROKER_URL'])
mqtt = Mqtt(app)
socketio = SocketIO(app)
@app.route("/")
def roots():
return render_template('index.html')
@app.route('/mqtt')
def mqtt_index():
return render_template('mqtt.html')
@socketio.on('subscribe')
def handle_subscribe(json_str):
print('Subscribe ' + json_str)
@socketio.on('unsubscribe_all')
def handle_unsubscribe_all():
print('Socket IO unsubscribe all')
mqtt.unsubscribe_all()
@socketio.on('connect')
def handle_connect():
print('Socket IO Connected')
@socketio.on('discconnect')
def handle_connect():
print('Socket IO Discconnect')
@mqtt.on_connect()
def handle_mqtt_connect():
print('MQTT Connected')
@mqtt.on_message()
def handle_mqtt_message(client, userdata, message):
print('MQTT Message')
data = dict(
topic=message.topic,
payload=message.payload.decode(),
qos=message.qos,
)
print(mqttresponse)
socketio.emit('mqtt_message', data=data)
@mqtt.on_log()
def handle_logging(client, userdata, level, buf):
print('MQTT log', level, buf)
pass
@app.before_first_request
def before_first_request():
print("before_first_request")
mqtt.subscribe('homeassistant/+/+/set', 0)
if __name__ == "__main__":
# Main http web server for firmware downloading and the main frontend.
socketio.run(app, host='0.0.0.0', port='6080', use_reloader=True)
mqtt.subscribe 应该去哪里以便它在第一次连接到网络服务器之前订阅我想要的主题?
【问题讨论】:
-
您是否尝试在
socketio.run()呼叫上方执行此操作?我想那是最早的地方。
标签: python-3.x flask flask-socketio