我使用
Flask
创建了一个网络应用程序。该应用程序将从用户处获取 input data
,然后它将迭代一堆 XML 文件并将所需的数据输出到屏幕上。
我的问题是,是否有一种方法可以在每次迭代后将结果填充/更新到屏幕上,而不是在最后全部显示?
我这么问是因为在我提交输入数据后,应用程序会运行很长时间来处理和显示数据。在此过程中,Web 应用程序是空白的、无响应的,并且在代码运行完成之前看不到任何进展。所以我想知道是否有一种方法可以在每次迭代后返回屏幕上的数据并使用每个数据更新页面。
我知道在
Tkinter
中我可以在循环中使用 win.update()
在每次迭代时重绘窗口。但是如果可能的话,我该如何使用 flask
/python 在网页上执行此操作?
我想要看到的是如何让我的应用程序执行得更快,以便更快地恢复输出。
代码:
list_output = []
temp_storage = {}
def testFunction(COMP, source="."):
for pathway in glob.glob(os.pathway.join(source,"x*.xml")):
document = temp_storage.setdefault(pathway, ET.parse(pathway).getroot())
theLocationPoint = document.findall('.//*[@unit="' + Unit + '"]')
if theLocationPoint:
unit_unique_id = document.get("ID")
unit_label = document.tag
comp_name = document.get("Name")
testFunction(unit_unique_id, source=source)
list_output.append("Unit Unique ID: " + unit_unique_id + " " + "Unit of Page: " + unit_label + " " + "Unit of Part: " + comp_name)
return list_output
@app.route('/', methods=['GET', 'POST'])
def home():
if request.method == 'POST':
name = request.form.get('name')
return_string = testFunction(name, source=r"C:/.../.../")
return render_template('my-form.html', result=return_string)
return render_template('my-form.html', result='')
if __name__ == '__main__':
app.run()
HTML:
<body>
<ol>
<!-- For loop logic of jinja2 template -->
{%for i in result%}
<li>{{i}}</li>
{%endfor%}
</ol>
</body>
在 Flask 中,服务器通常仅在处理完整个请求后才向客户端发送响应。这意味着,如果您想在处理过程中更新客户端的内容,则需要使用 AJAX 等技术从服务器获取部分更新,而无需完全重新加载页面。
当然,你可以利用
yield
关键字在Flask中实现流式传输,如@doneforaiur所提到的。
有关更详细的信息和示例,我建议查看有关流式传输的 Flask 文档:Flask Streaming Documentation