我正在尝试构建一个应用程序,该应用程序通过带有flask的Web服务页面,与此同时,在后台启动一个向其他计算机询问状态并更新变量的线程,我也想通过socketio将状态发送给更新网页(如果存在,则保存信息)
很遗憾,我无法做到这一点,在发送或接收消息时遇到一些问题
这里是python代码:
from time import sleep
from flask import Flask, render_template, request, copy_current_request_context
from flask_sqlalchemy import SQLAlchemy
import sqlalchemy as db
from flask_htpasswd import HtPasswdAuth
from sqlalchemy import desc
from threading import Thread, Event
import datetime
import os
import logging
from flask_socketio import SocketIO, emit
import hashlib
class config():
hostip = '0.0.0.0'
portip = 8080
class statoMacchina():
status = -1
mode = -1
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socket = SocketIO(app, async_mode='threading')
db = SQLAlchemy(app)
thread = Thread()
thread_stop_event = Event()
class getStatusThread(Thread):
def __init__(self):
self.delay = 30
super(getStatusThread, self).__init__()
def getStatus(self):
try:
print(" try " )
emit('status', {'mode': statoMacchina.mode, 'status' : statoMacchina.status})
except Exception as ex:
print(ex.args)
#sleep(self.delay)
def run(self):
self.getStatus()
thread = getStatusThread()
thread.start()
@socket.on('getstatus', namespace='/command')
def cmdgetstatus():
emit('replyesec', {'Esec': "listaaaaaa"})
#emit('status', {'mode': statoMacchina.mode, 'status' : statoMacchina.status})
global thread
if not thread.is_alive():
print("Starting Thread")
thread = getStatusThread()
thread.start()
@app.route("/",methods=['GET'])
def index():
return render_template(
'index.html', **locals())
if __name__ == "__main__":
try:
tim = datetime.datetime.now()
print(tim)
socket.run(app, host=config.hostip, port=config.portip)
except KeyboardInterrupt:
print("fine")
except Exception as ex:
print(ex.args)
这里是获取套接字消息的js代码:
$(document).ready(function(){
socket.on('status', function(msg) {
console.log("status - " + msg);
$("#statoopc").html(msg.mode + " - " + msg.status);
});
}
我得到的问题是,如果在函数getStatus中,我这样保留它:
('在请求上下文之外工作。\ n \ n这通常意味着您尝试使用需要\ nan活动HTTP请求的功能。请查阅有关测试的文档\ n有关如何进行的信息避免这个问题。',)
如果我添加套接字。在发出之前,我没有收到eny错误,但是我也没有收到消息
例如,对于我来说,如果状态发生变化,也可以触发从线程到主线程的事件以发送消息,但是我也不知道该怎么做
ps。我刚刚添加了一个[[getstatus处理程序,以进行一些测试,以从网页上的按钮发送这些消息,并且它可以正常工作,它仅在线程中不起作用
也许问题是我在没有连接的实体的情况下试图发出信号?如何检查?