Python 3.x 将从线程发出与flask socketio python3一起使用时出错
我正在尝试构建一个应用程序,它通过web和flask提供一个页面,同时在后台启动一个线程,向另一台机器请求状态并更新一个变量,我还想通过socketio发送该状态以更新网页(如果存在,则保存信息) 不幸的是,我无法做到这一点,我在发送或接收信息时遇到了一些问题 这里是python代码:Python 3.x 将从线程发出与flask socketio python3一起使用时出错,python-3.x,flask,flask-socketio,Python 3.x,Flask,Flask Socketio,我正在尝试构建一个应用程序,它通过web和flask提供一个页面,同时在后台启动一个线程,向另一台机器请求状态并更新一个变量,我还想通过socketio发送该状态以更新网页(如果存在,则保存信息) 不幸的是,我无法做到这一点,我在发送或接收信息时遇到了一些问题 这里是python代码: from time import sleep from flask import Flask, render_template, request, copy_current_request_context fro
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这通常意味着您
试图使用活动HTTP请求所需的功能。
有关如何进行测试的信息,请参阅测试文档
避免此问题。“,)
如果我添加套接字。在emit之前,我没有得到eny错误,但是我也没有得到消息
另外,对于我来说,如果状态改变,可以触发一个从线程到主线程的事件来发送消息,但是我也不知道怎么做
另外,我刚刚添加了一个getstatus handlear来做一些测试,从网页上的一个按钮发送它们,它可以工作,它不仅仅在线程中工作
也许问题是我试图在没有连接实体的情况下发射?如何检查?函数使用来自请求上下文的一些默认值。如果希望在没有请求上下文的地方使用此函数,则必须提供更多参数。特别是,您需要添加
room
,以指示谁是消息的接收者,namespace
emit()
函数使用来自请求上下文的一些默认值。如果希望在没有请求上下文的地方使用此函数,则必须提供更多参数。特别是,您需要添加room
来指明谁是消息的接收者,并且namespace
哦,非常感谢,添加名称空间似乎是可行的。不幸的是,它只有在本地主机中使用时才起作用,如果我通过其他设备访问它,我就无法在jsoh中获得套接字数据。非常感谢,添加名称空间似乎是可行的。不幸的是,只有当我在localhost中使用它时,它才起作用,如果我通过另一个设备访问它,我不会在js中获取套接字数据