Python Flask Socketio仅为第一条消息发出
使用烧瓶Socketio和烧瓶Mqtt:Python Flask Socketio仅为第一条消息发出,python,flask,socket.io,sqlalchemy,mqtt,Python,Flask,Socket.io,Sqlalchemy,Mqtt,使用烧瓶Socketio和烧瓶Mqtt: @mqtt.on_message() def handle_mqtt_message(client, userdata, message): ### Extract from Payload ### payload_list = message.payload.decode().split() time_list = [int(x) for x in re.split(r'[-T:.]', payload_list[2])]
@mqtt.on_message()
def handle_mqtt_message(client, userdata, message):
### Extract from Payload ###
payload_list = message.payload.decode().split()
time_list = [int(x) for x in re.split(r'[-T:.]', payload_list[2])]
tstmpObj = datetime(time_list[0], #Year
time_list[1], #Month
time_list[2], #Day
time_list[3], #Hour
time_list[4], #Minute
time_list[5] #Sec
)
### make dict from payload data ###
data = dict(mssid = random.randint(0,10000),
fduid = "FDU-"+message.topic[-6:],
evnty = payload_list[0],
tstmp = tstmpObj.strftime("%a, %d %b %Y - %I:%M:%S %p"),
locur = payload_list[1])
### Print dictionary ###
print(data)
### Real-Time Alert on webpage ###
socketio.emit('mqtt_message', data=data)
### Insert message into database ###
with create_app().app_context():
event = Evntlg(fduid = data['fduid'],
evnty = data['evnty'],
tstmp = tstmpObj,
locur = data['locur'])
db.session.add(event)
db.session.commit()
emit()只在第一个onMessage()上起作用,在第二个onMessage()之后不起作用。
我正在使用应用程序工厂和蓝图。
所有收到的消息仍正确插入数据库
##编辑##
与monkey patching相关的代码-在应用程序运行之前就开始修补
import eventlet
eventlet.monkey_patch()
from floodwatch import create_app, socketio
app = create_app()
if __name__ == "__main__":
socketio.run(app, host='localhost', port=5000, debug=True)
我必须在终端中按CTRL-C键,然后再次启动它才能再次获取RT消息,但这也是第一次,而且在同一个会话中不会再次出现。您使用的是eventlet还是gevent服务器?如果是,您是否对标准库进行了monkey修补?是的,我正在应用程序中尽早使用Eventlet进行monkey修补。事实上,执行的第一行代码是猴子补丁。谢谢你的回复@Miguel是因为在数据库插入期间,当前应用程序切换到我们在
with
语句中创建的应用程序吗?也许这就是插座不工作的原因。。。因为新的应用程序没有通过socketio(0_0)运行,我就在这里吗?