我在Flask上运行了一个网页,用户点击按钮,然后给芹菜一个长时间运行的程序。Ajax不断轮询以检查芹菜是否有输出。如果芹菜有结果,网页上将显示警报。现在,如果在芹菜中运行的程序很短,则可以偶尔显示警报。如果在芹菜中运行的程序需要很长时间,则无法显示。现在网页似乎是:点击按钮 - 警报 - 按顺序刷新页面。
ubuntu 16.04, 铬
芹菜部分:
@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>
实际结果可能是网页可以在芹菜完成后显示警报。但是现在不能了,请帮我解决这个问题,非常感谢!
我发现,如果执行轮询的按钮和在烧瓶中提交表单的按钮相同,则网页无法显示警报。我刚刚创建了一个新按钮,专门用于启动 ajax 轮询,这样它就成功了,网页可以显示警报!