Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 将从线程发出与flask socketio python3一起使用时出错_Python 3.x_Flask_Flask Socketio - Fatal编程技术网

Python 3.x 将从线程发出与flask socketio python3一起使用时出错

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

我正在尝试构建一个应用程序,它通过web和flask提供一个页面,同时在后台启动一个线程,向另一台机器请求状态并更新一个变量,我还想通过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这通常意味着您 试图使用活动HTTP请求所需的功能。 有关如何进行测试的信息,请参阅测试文档 避免此问题。“,)

如果我添加套接字。在emit之前,我没有得到eny错误,但是我也没有得到消息

另外,对于我来说,如果状态改变,可以触发一个从线程到主线程的事件来发送消息,但是我也不知道怎么做

另外,我刚刚添加了一个getstatus handlear来做一些测试,从网页上的一个按钮发送它们,它可以工作,它不仅仅在线程中工作


也许问题是我试图在没有连接实体的情况下发射?如何检查?

函数使用来自请求上下文的一些默认值。如果希望在没有请求上下文的地方使用此函数,则必须提供更多参数。特别是,您需要添加
room
,以指示谁是消息的接收者,
namespace

emit()
函数使用来自请求上下文的一些默认值。如果希望在没有请求上下文的地方使用此函数,则必须提供更多参数。特别是,您需要添加
room
来指明谁是消息的接收者,并且
namespace

哦,非常感谢,添加名称空间似乎是可行的。不幸的是,它只有在本地主机中使用时才起作用,如果我通过其他设备访问它,我就无法在jsoh中获得套接字数据。非常感谢,添加名称空间似乎是可行的。不幸的是,只有当我在localhost中使用它时,它才起作用,如果我通过另一个设备访问它,我不会在js中获取套接字数据