Python 每次本地文件更改时,使用Flask SocketIO更新网页

Python 每次本地文件更改时,使用Flask SocketIO更新网页,python,flask,Python,Flask,每次更改本地文件名时,我都需要更新我的网页。不使用套接字,我只需每1秒刷新一次页面就可以完成。我是通过读取文件名的内容并将其发送到我的web模板来实现的 但是我需要使用套接字并使这个过程异步,这样就不会使用自动刷新。我正在使用Flask作为我的web框架 下面是一个示例Flask应用程序,它监视文件并在文件更改时发出套接字消息。注意,这假设您在Linux平台上(用于文件监视) app.py from flask import Flask, render_template from flask_s

每次更改本地文件名时,我都需要更新我的网页。不使用套接字,我只需每1秒刷新一次页面就可以完成。我是通过读取文件名的内容并将其发送到我的web模板来实现的


但是我需要使用套接字并使这个过程异步,这样就不会使用自动刷新。我正在使用Flask作为我的web框架

下面是一个示例Flask应用程序,它监视文件并在文件更改时发出套接字消息。注意,这假设您在Linux平台上(用于文件监视)

app.py

from flask import Flask, render_template
from flask_socketio import SocketIO
import pyinotify

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
thread = None


class ModHandler(pyinotify.ProcessEvent):
    def process_IN_CLOSE_WRITE(self, evt):
        socketio.emit('file updated')


def background_thread():
    handler = ModHandler()
    wm = pyinotify.WatchManager()
    notifier = pyinotify.Notifier(wm, handler)
    wm.add_watch('test.log', pyinotify.IN_CLOSE_WRITE)
    notifier.loop()


@app.route('/')
def index():
    return render_template('index.html', async_mode=socketio.async_mode)


@socketio.on('connect')
def test_connect():
    global thread
    if thread is None:
        thread = socketio.start_background_task(target=background_thread)


if __name__ == '__main__':
    socketio.run(app, debug=True)
index.html

<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script>
<script type="text/javascript" charset="utf-8">
    var socket = io.connect('http://' + document.domain + ':' + location.port);
    socket.on('connect', function() {
        socket.emit('my event', {data: 'I\'m connected!'});
    });
    socket.on('file updated', function(data) {                                  
        console.log('the file has been updated');
    });

</script>

var socket=io.connect('http://'+document.domain+':'+location.port);
socket.on('connect',function(){
emit('my event',{data:'I'm connected!'});
});
socket.on('file updated',函数(数据){
log('文件已更新');
});

下面是一个示例Flask应用程序,它监视文件并在文件更改时发出套接字消息。注意,这假设您在Linux平台上(用于文件监视)

app.py

from flask import Flask, render_template
from flask_socketio import SocketIO
import pyinotify

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
thread = None


class ModHandler(pyinotify.ProcessEvent):
    def process_IN_CLOSE_WRITE(self, evt):
        socketio.emit('file updated')


def background_thread():
    handler = ModHandler()
    wm = pyinotify.WatchManager()
    notifier = pyinotify.Notifier(wm, handler)
    wm.add_watch('test.log', pyinotify.IN_CLOSE_WRITE)
    notifier.loop()


@app.route('/')
def index():
    return render_template('index.html', async_mode=socketio.async_mode)


@socketio.on('connect')
def test_connect():
    global thread
    if thread is None:
        thread = socketio.start_background_task(target=background_thread)


if __name__ == '__main__':
    socketio.run(app, debug=True)
index.html

<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script>
<script type="text/javascript" charset="utf-8">
    var socket = io.connect('http://' + document.domain + ':' + location.port);
    socket.on('connect', function() {
        socket.emit('my event', {data: 'I\'m connected!'});
    });
    socket.on('file updated', function(data) {                                  
        console.log('the file has been updated');
    });

</script>

var socket=io.connect('http://'+document.domain+':'+location.port);
socket.on('connect',function(){
emit('my event',{data:'I'm connected!'});
});
socket.on('file updated',函数(数据){
log('文件已更新');
});

您可以在套接字中指定页面内容,如下所示:

socketio.emit('connect',
                     {'field_doc': "some content", 'another_field' :"some other content"})

您可以在套接字中指定页面内容,如下所示:

socketio.emit('connect',
                     {'field_doc': "some content", 'another_field' :"some other content"})

嗨,这是正常工作,但只有前2次。之后,每当我更新文件时,更新日志就不会出现。我的系统有问题吗?我通过将proc_fun=ModHandler()添加为wm.add_watch('test.log',pyinotify.IN_CLOSE_WRITE,proc_fun=ModHandler())解决了之前的疑问。这工作正常,但仅在前2次。之后,每当我更新文件时,更新日志就不会出现。我的系统有问题吗?我通过将proc_fun=ModHandler()添加为wm.add_watch('test.log',pyinotify.IN_CLOSE_WRITE,proc_fun=ModHandler())解决了前面的疑问