false静态进度屏幕

发布于 2021-01-29 18:00:21

选项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,我仍然需要提交表单数据以进行
服务器端 处理。

关注者
0
被浏览
50
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以流式传输响应以获取 非常
    简单的进度报告。有关更多信息,请参见有关流式传输的文档。此示例在等待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请求轮询任务的进度。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看