后台任务完成后如何刷新首页
How to refresh front page after back-end task completed
我正在用 python flask 设计一个网络应用程序,处理流程如下:
- 用户选择一个指定的URL,要求服务器站点做一些耗时的任务;
- 那么耗时任务运行在一个新的线程中;
- #2 完成后,服务器将更新一些关于 URL 的信息,我需要刷新 #1
中的页面
不知道如何将"completion"状态通知给前端,从而刷新页面
谁能帮帮我?
谢谢
使用 flask-socketio 可能会满足您的要求。它在前端和后端之间建立连接,让后端发出消息,前端注册一个回调,当它收到事件时触发。
$ pip install flask-socketio
app.py
import json
import time
from flask import Flask, render_template
from flask_socketio import SocketIO, emit
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
@app.route('/')
def hello(name=None):
return render_template('index.html')
@socketio.on('long-running-event')
def handle_my_custom_event(input_json):
time.sleep(5)
emit('processing-finished', json.dumps({'data': 'finished processing!'}))
if __name__ == '__main__':
socketio.run(app)
templates/index.html
<html>
<body>
<button id="long-running-operation">Process data</button>
<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);
let button = document.getElementById('long-running-operation');
button.addEventListener('click', () => {
socket.emit('long-running-event', {data: 'process data'});
});
socket.on('processing-finished', function (data) {
alert(JSON.parse(data).data)
});
</script>
</body>
</html>
然后 运行 带有 python app.py
的应用。在 http://127.0.0.1:5000/
的浏览器中访问应用程序,然后单击按钮。该按钮将向 flask 发送 'long-running-event'
请求,flask 通过休眠 5 秒来模拟一个漫长的 运行ning 过程来处理它。然后 flask 发出 'processing-finished
消息并且 javascript 触发注册回调以通过提醒 flask 发送的消息来监听该事件。
我正在用 python flask 设计一个网络应用程序,处理流程如下:
- 用户选择一个指定的URL,要求服务器站点做一些耗时的任务;
- 那么耗时任务运行在一个新的线程中;
- #2 完成后,服务器将更新一些关于 URL 的信息,我需要刷新 #1 中的页面
不知道如何将"completion"状态通知给前端,从而刷新页面
谁能帮帮我? 谢谢
使用 flask-socketio 可能会满足您的要求。它在前端和后端之间建立连接,让后端发出消息,前端注册一个回调,当它收到事件时触发。
$ pip install flask-socketio
app.py
import json
import time
from flask import Flask, render_template
from flask_socketio import SocketIO, emit
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
@app.route('/')
def hello(name=None):
return render_template('index.html')
@socketio.on('long-running-event')
def handle_my_custom_event(input_json):
time.sleep(5)
emit('processing-finished', json.dumps({'data': 'finished processing!'}))
if __name__ == '__main__':
socketio.run(app)
templates/index.html
<html>
<body>
<button id="long-running-operation">Process data</button>
<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);
let button = document.getElementById('long-running-operation');
button.addEventListener('click', () => {
socket.emit('long-running-event', {data: 'process data'});
});
socket.on('processing-finished', function (data) {
alert(JSON.parse(data).data)
});
</script>
</body>
</html>
然后 运行 带有 python app.py
的应用。在 http://127.0.0.1:5000/
的浏览器中访问应用程序,然后单击按钮。该按钮将向 flask 发送 'long-running-event'
请求,flask 通过休眠 5 秒来模拟一个漫长的 运行ning 过程来处理它。然后 flask 发出 'processing-finished
消息并且 javascript 触发注册回调以通过提醒 flask 发送的消息来监听该事件。