【发布时间】:2021-03-24 18:09:21
【问题描述】:
在我的项目中,我使用 flask_socketio 作为服务器,使用 socket.io-client 作为客户端。我的 main.py(flask server) 不断读取一个不断更新的日志文件(console.log)。当在 UI 中单击开始按钮时,会显示日志文件的数据,但随着我的日志文件更新,更新的数据不会显示在 UI 中。我必须刷新页面或再次单击按钮才能看到更新的数据。 我希望通过单击按钮将日志文件的数据实时流式传输到 UI 上。如何解决这个问题?
烧瓶代码
from flask import Flask, jsonify
# Needed for localhost testing.
from flask_cors import CORS, cross_origin
from flask_socketio import SocketIO, emit
from time import sleep
import pdb
import json
app = Flask(__name__)
# Socket io setup.
app.config['SECRET_KEY'] = 'secret!'
# |cors_allowed_origins| is required for localhost testing.
socket = SocketIO(app, cors_allowed_origins="*")
# For localhost testing.
CORS(app)
@socket.on('event_stream', namespace='/logConsole')
def test_connect():
def generate():
fname = "./src/console.log"
with open(fname) as f:
yield f.read()
emit_data = next(generate())
socket.sleep(0)
emit('custom-server-msg', {'data': emit_data})
if __name__ == '__main__':
socket.run(app)
反应代码
import React from 'react'
import io from 'socket.io-client'
class App extends React.Component {
state = { startVar: true, setVar: false };
setSocketListeners() {
let socket = io.connect('ws://localhost:5000/logConsole');
socket.emit('event_stream', () => {
console.log("Websocket connected: " + socket.connected)
})
socket.on('custom-server-msg', (data) => {
console.log("Data received: " + data.data)
const setup_logs = data.data;
this.setState({ setup_logs });
})
}
render() {
return (
<div className="App">
<h1>Data from log file</h1>
<button type="button" onClick={() => this.setSocketListeners()}>Start</button>
<p>{this.state.setup_logs}</p>
</div>
);
}
}
export default App;
【问题讨论】:
-
当您收到 custom-server-msg 事件时,您是否在浏览器控制台中看到了您的日志语句?
-
@rdrw 是的!我也会添加我的浏览器控制台的屏幕截图。请看一下
-
对此我不太确定,但
custom-server-msg处理程序的上下文可能与类实例不同,因此没有像预期的那样真正调用setState并且静默失败。我很好奇您是否将this的值记录在发出处理程序中,如果它是undefined或当前类组件以外的上下文。
标签: reactjs flask websocket socket.io data-stream