【发布时间】:2023-04-01 09:07:01
【问题描述】:
我有一个在 Flask 上运行的网页,用户点击按钮然后给 celery 一个长时间运行的程序。 Ajax 不断轮询以检查 celery 是否有输出。如果 celery 有结果,则会在网页上显示警报。现在如果在 celery 中运行的程序很短,可以偶尔显示警报。 celery 中运行的程序如果运行时间较长,则无法显示。而现在的网页好像是:点击按钮-警报-按顺序刷新页面。
ubuntu 16.04,Chrome
芹菜部分:
@celery.task(name='app.add')
def add():
z=getLength()
return {'result':z}
@app.route('/addit', methods=['POST'])
def addit():
task = add.delay()
return jsonify({}),202,{'Location': url_for('taskstatus',task_id=task.id)}
@app.route('/status/<task_id>')
def taskstatus(task_id):
task = add.AsyncResult(task_id)
if 'result' in task.info:
response['result'] = task.info['result']
return jsonify(response)
ajax 轮询部分:
<script>
function start_long_task() {
$.ajax({
type: 'POST',
url: '/addit',
success: function(data, status, request) {
status_url = request.getResponseHeader('Location');
update_progress(status_url) ;
},
error: function() {
alert('Unexpected error');
}
});
}
function update_progress(status_url) {
// send GET request to status URL
$.getJSON(status_url, function(data) {
if ('result' in data) {
// show result
alert('Result: ' + data['result']);
}
else {
setTimeout(function() {
update_progress(status_url);
}, 1000);
}
});
}
$(function() {
$('#start-bg-job').click(start_long_task);
});
</script>
实际结果可能是网页可以在 celery 完成时显示警报。但是现在不行了,请帮我解决这个问题,非常感谢!
【问题讨论】:
标签: python ajax flask celery long-polling