为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

茅侃侃 2021-05-14 18:00:14
我创建了一个页面,该页面允许用户上传excel文件,然后将其解析为列,然后将行一次插入数据库500行。这不是一个非常漫长的过程-25到90秒之间,但是足够长,我想以状态消息和/或进度条的形式给用户一些反馈,让他们知道它实际上仍在工作。我的应用程序是用烧瓶编写的,如下所示:app.pyfrom flask import Flask, render_template, requestimport 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 pageapp.run()我知道您只能发送一个回复请求,但是如果我只能发送一个回复,该如何给流程提供用户状态?也许我会采用错误的方式,但是我认为这是一个非常普遍的用例。如果这种方式行不通,我还应该怎么设置呢?由于某种原因,标记为该问题的重复项。该问题询问如何将连续的值流打印到屏幕上。在这里,我要问的是如何在某些执行点发送消息。我认为所提供的有关Flask-socketio的评论提供了针对不同问题的不同方法。
查看完整描述

2 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

“对一个请求的一个响应”与HTTP协议的工作方式有关:客户端发送查询和一些数据(POST请求),而服务器以其他一些数据进行响应(您的“一个响应”)。从技术上讲,您可以使服务器以块的形式发送回一些响应,但这在实践中却不是这样。首先,浏览器不能很好地处理这一问题。

您需要以其他方式执行此操作。例如,如注释者所建议的那样,使用SocketIO创建一个“边通道”。然后,您可以通过此副渠道将更新发送给客户端-print您可以使用而不是s socketio.emit

在客户端,您将在页面加载时首先订阅SocketIO通道。然后,您将通过AJAX调用(或在单独的iframe中)提交文件,并使SocketIO连接在页面上保持打开状态以显示更新。

这样,POST请求与您的“页面加载”是分开的。页面上的javascript保持活动状态,可以读取和显示进度更新,并且上传(带有相关的等待时间)在后台进行。


查看完整回答
反对 回复 2021-05-25
?
PIPIONE

TA贡献1829条经验 获得超9个赞

我也可以像@matejcik在他们的答案中解释的那样来做,但是还有另一种方法。websockets所做的是pushing在更新后将数据返回给浏览器。还有pull方法。

您可以定期向服务器发送查询,服务器将为您提供更新。您仍然必须使用AJAX发送请求和javascript的setTimeout功能在查询之间等待,但是您要做的基本上是刷新页面而不向用户显示。对于初学者来说更容易理解,因为所使用的技术仍然是静止的GET。无需打印新日志,而是将其添加到字符串(或数组)中,并且在发出GET请求时,您将返回此数组,清除文本输出并使用新旧信息写入此新数组。

这种方法远不如websockets有效,但是对于原型制作来说它可以更快。


查看完整回答
反对 回复 2021-05-25
  • 2 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号