false静态进度屏幕
选项1:无Javascript
我只想显示一个 静态 模板,该模板在任务运行时显示“请稍候…”。这是route函数的简化版本:
@app.route('/import/towers/<case_id>/<filename>', 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之后,我在模板中有这个:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script type="application/javascript">
$('form').on('submit', function() {
$('#content').empty();
$('#content').html('please wait...');
})
</script>
对于替换内容以在提交时显示进度页,它可以很好地工作,但是现在不提交该表单以供服务器端处理。我尝试设置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请求轮询任务的进度。