在烧瓶中发出后期请求期间如何给出状态?

我创建了一个页面,该页面允许用户上传excel文件,然后将其解析为列,然后将行一次插入数据库500行。


这不是一个非常漫长的过程-25到90秒之间,但是足够长,我想以状态消息和/或进度条的形式给用户一些反馈,让他们知道它实际上仍在工作。


我的应用程序是用烧瓶编写的,如下所示:


app.py


from flask import Flask, render_template, request

import tqdm 


app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])

def fun():

    if request.method == 'GET':

        return render_template('index.html')

    else:

        filename = request.form['filename']

        print('opening file') #change from console print to webpage

        df = pandas.read_excel(filename)

        print('File read.. processing data\n') #change from console to webpage

        processData()

        print('connecting to db....\n') #change to webpage print

        db.connect()

        print('connected to db! inserting rows') #change to webpage print

        bulk_inserts = rows/500

        for i in tqdm(range(bulk_inserts)): #wrapping tqdm around range makes a progress bar

            insert500rows() 

        db.commit()

        db.disconnect()

        return 'Complete. ' + str(rows) + ' inserted.' #this gets sent as a post to the page


app.run()

我知道您只能发送一个回复请求,但是如果我只能发送一个回复,该如何给流程提供用户状态?也许我会采用错误的方式,但是我认为这是一个非常普遍的用例。如果这种方式行不通,我还应该怎么设置呢?


由于某种原因,标记为该问题的重复项。该问题询问如何将连续的值流打印到屏幕上。在这里,我要问的是如何在某些执行点发送消息。我认为所提供的有关Flask-socketio的评论提供了针对不同问题的不同方法。


茅侃侃
浏览 125回答 2
2回答

明月笑刀无情

“对一个请求的一个响应”与HTTP协议的工作方式有关:客户端发送查询和一些数据(POST请求),而服务器以其他一些数据进行响应(您的“一个响应”)。从技术上讲,您可以使服务器以块的形式发送回一些响应,但这在实践中却不是这样。首先,浏览器不能很好地处理这一问题。您需要以其他方式执行此操作。例如,如注释者所建议的那样,使用SocketIO创建一个“边通道”。然后,您可以通过此副渠道将更新发送给客户端-print您可以使用而不是s socketio.emit。在客户端,您将在页面加载时首先订阅SocketIO通道。然后,您将通过AJAX调用(或在单独的iframe中)提交文件,并使SocketIO连接在页面上保持打开状态以显示更新。这样,POST请求与您的“页面加载”是分开的。页面上的javascript保持活动状态,可以读取和显示进度更新,并且上传(带有相关的等待时间)在后台进行。

PIPIONE

我也可以像@matejcik在他们的答案中解释的那样来做,但是还有另一种方法。websockets所做的是pushing在更新后将数据返回给浏览器。还有pull方法。您可以定期向服务器发送查询,服务器将为您提供更新。您仍然必须使用AJAX发送请求和javascript的setTimeout功能在查询之间等待,但是您要做的基本上是刷新页面而不向用户显示。对于初学者来说更容易理解,因为所使用的技术仍然是静止的GET。无需打印新日志,而是将其添加到字符串(或数组)中,并且在发出GET请求时,您将返回此数组,清除文本输出并使用新旧信息写入此新数组。这种方法远不如websockets有效,但是对于原型制作来说它可以更快。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python