Flask 静态进度屏幕
Flask Static Progress Screen
选项 1:否 Javascript
我只想在任务运行时显示一个 static 模板 'please wait...'。这是路由功能的简化版本:
@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
而不返回,这会跳过我需要完成的处理。我需要它来显示进度屏幕 ,而 进程运行,然后在完成时显示 'success'。我该怎么做?
选项 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();
但这会使它等待服务器端处理,从而破坏了 progress/wait 屏幕的意义。如果我使用 Javascript.
,我仍然需要为 服务器端 处理提交的表单数据
您可以流式传输响应以获得非常简单的进度报告。有关详细信息,请参阅 the docs on streaming。此示例在等待 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 请求轮询它的进度。
选项 1:否 Javascript
我只想在任务运行时显示一个 static 模板 'please wait...'。这是路由功能的简化版本:
@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
而不返回,这会跳过我需要完成的处理。我需要它来显示进度屏幕 ,而 进程运行,然后在完成时显示 'success'。我该怎么做?
选项 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();
但这会使它等待服务器端处理,从而破坏了 progress/wait 屏幕的意义。如果我使用 Javascript.
您可以流式传输响应以获得非常简单的进度报告。有关详细信息,请参阅 the docs on streaming。此示例在等待 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 请求轮询它的进度。