使用烧瓶socketio python3使用线程发出错误

问题描述 投票:0回答:1

我正在尝试构建一个应用程序,该应用程序通过带有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处理程序,以进行一些测试,以从网页上的按钮发送这些消息,并且它可以正常工作,它仅在线程中不起作用

也许问题是我在没有连接的实体的情况下试图发出信号?如何检查?
python-3.x flask flask-socketio
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.