我在Flask中構建了一個相當簡單的WebApp,通過網站的API執行功能。我的用戶使用他們的帳戶URL和API令牌填寫表單;當他們提交表單時,我有一個python腳本,通過API從他們的帳戶導出PDF文件。此功能可能需要很長時間,因此我想在窗體頁面上顯示引導程序進度欄,指示腳本在進程中的位置。我的問題是如何在功能運行時更新進度條?這裏是我正在談論的簡化版本。Flask App:功能運行時更新進度條
views.py:
@app.route ('/export_pdf', methods = ['GET', 'POST'])
def export_pdf():
form = ExportPDF()
if form.validate_on_submit():
try:
export_pdfs.main_program(form.account_url.data,
form.api_token.data)
flash ('PDFs exported')
return redirect(url_for('export_pdf'))
except TransportException as e:
s = e.content
result = re.search('<error>(.*)</error>', s)
flash('There was an authentication error: ' + result.group(1))
except FailedRequest as e:
flash('There was an error: ' + e.error)
return render_template('export_pdf.html', title = 'Export PDFs', form = form)
export_pdf.html:
{% extends "base.html" %}
{% block content %}
{% include 'flash.html' %}
<div class="well well-sm">
<h3>Export PDFs</h3>
<form class="navbar-form navbar-left" action="" method ="post" name="receipt">
{{form.hidden_tag()}}
<br>
<div class="control-group{% if form.errors.account_url %} error{% endif %}">
<label class"control-label" for="account_url">Enter Account URL:</label>
<div class="controls">
{{ form.account_url(size = 50, class = "span4")}}
{% for error in form.errors.account_url %}
<span class="help-inline">[{{error}}]</span><br>
{% endfor %}
</div>
</div>
<br>
<div class="control-group{% if form.errors.api_token %} error{% endif %}">
<label class"control-label" for="api_token">Enter API Token:</label>
<div class="controls">
{{ form.api_token(size = 50, class = "span4")}}
{% for error in form.errors.api_token %}
<span class="help-inline">[{{error}}]</span><br>
{% endfor %}
</div>
</div>
<br>
<button type="submit" class="btn btn-primary btn-lg">Submit</button>
<br>
<br>
<div class="progress progress-striped active">
<div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%">
<span class="sr-only"></span>
</div>
</form>
</div>
</div>
{% endblock %}
和export_pdfs.py:
def main_program(url, token):
api_caller = api.TokenClient(url, token)
path = os.path.expanduser('~/Desktop/'+url+'_pdfs/')
pdfs = list_all(api_caller.pdf.list, 'pdf')
total = 0
count = 1
for pdf in pdfs:
total = total + 1
for pdf in pdfs:
header, body = api_caller.getPDF(pdf_id=int(pdf.pdf_id))
with open('%s.pdf' % (pdf.number), 'wb') as f:
f.write(body)
count = count + 1
if count % 50 == 0:
time.sleep(1)
在去年函數I共有PDF文件的數量我將出口,並且在處理過程中持續進行計數。如何將當前進度發送到我的.html文件以適應進度條的'style ='標記?最好以我可以在其他頁面上重複使用相同工具進度條的方式。如果我沒有提供足夠的信息,請告訴我。
我不想給一個編碼答案,但讓我指出你的解決方案。一個傳統的想法是開始一個線程來做PDF導出。線程將進度報告給數據庫表。您的瀏覽器前端執行ajax輪詢以從數據庫獲取進度值。 ajax輪詢的替代方案,您可能需要查看flask-socketio以將進度值向下推送到您的瀏覽器。這種選擇可能需要更多的工程努力。 – chfw
@chfw的想法是你應該如何處理它。但不是一個線程,它應該是一個等待工作的額外過程。而不是一個數據庫,我會使用類似Redis的東西,並通過消息隊列進行通信。最後,我不推薦使用AJAX或WebSockets,而是推薦[SSE](https://developer.mozilla.org/en-US/docs/Server-sent_events),它更容易設置。 – dAnjou