Flask静态进度屏幕

选项1:没有Javascript

我只是想在任务运行时显示一个静态模板,上面写着“请稍候……”。 这是路由function的简化版本:

@app.route('/import/towers//', methods=['GET', 'POST']) def import_towers(case_id=None, filename=None): case_number = TollsCase.get_case_number(case_id) with open(os.path.join(app.config['UPLOAD_FOLDER'], filename), 'rb') as f: csv_f = csv.reader(f) headers = next(csv_f) if flask.request.method == 'POST': # show static progress screen here then process records in csv file for row in csv_f: # process record return 'success' 

它不会让我使用render_template而不返回,这会跳过我需要完成的处理。 我需要它在流程运行显示进度屏幕然后在完成后显示“成功”。 我该怎么做呢?


选项2:Javascript

如果无法完成并且必须使用Javascript,那么这就是我到目前为止所尝试的:

在html之后,我在模板中有这个:

   $('form').on('submit', function() { $('#content').empty(); $('#content').html('please wait...'); })  

它适用于替换内容以在提交时显示进度页面,但现在表单未提交用于服务器端处理。 我尝试在表单属性中设置data-ajax="false" ,但是没有解决问题。 我也尝试过使用this.submit(); 在清除内容之前,它使它等待服务器端处理,从而击败进度/等待屏幕的点。 如果我使用Javascript,我仍然需要提交用于服务器端处理的表单数据。

您可以流式传输响应以获得非常简单的进度报告。 有关更多信息,请参阅有关流媒体的文档 。 此示例在等待5秒时输出完成百分比。 而不是睡觉,你将处理csv或任何你需要做的事情。

 from flask import Flask, Response import time app = Flask(__name__) @app.route('/') def index(): def generate(): yield 'waiting 5 seconds\n' for i in range(1, 101): time.sleep(0.05) if i % 10 == 0: yield '{}%\n'.format(i) yield 'done\n' return Response(generate(), mimetype='text/plain') app.run() 

这将在5秒内输出以下内容:

 waiting 5 seconds 10% 20% 30% 40% 50% 60% 70% 80% 90% 100% done 

这不是很复杂,但它也只是纯文本。 一个更强大的解决方案是使用Celery在后台运行任务,并使用ajax请求轮询它的进度。