मैं फ्लास्क में एक साधारण सरल वेब ऐप बना रहा हूं जो किसी वेबसाइट के एपीआई के माध्यम से कार्य करता है। मेरे उपयोगकर्ता अपने खाता यूआरएल और एपीआई टोकन के साथ एक फॉर्म भरते हैं; जब वे फॉर्म जमा करते हैं तो मेरे पास एक पायथन स्क्रिप्ट है जो एपीआई के माध्यम से अपने खाते से पीडीएफ निर्यात करती है। इस फ़ंक्शन में काफी समय लग सकता है, इसलिए मैं फॉर्म पेज पर एक बूटस्ट्रैप प्रगति पट्टी प्रदर्शित करना चाहता हूं जो दर्शाता है कि स्क्रिप्ट की प्रक्रिया में कितनी दूर है। मेरा सवाल यह है कि फ़ंक्शन चल रहा है जैसे मैं प्रगति पट्टी को कैसे अपडेट करूं? मैं किस बारे में बात कर रहा हूं इसका सरलीकृत संस्करण यहां दिया गया है।फ्लास्क ऐप: फ़ंक्शन रन करते समय प्रगति पट्टी अपडेट करें
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)
कि पिछले समारोह में मैं कुल पीडीएफ़ की संख्या है मैं निर्यात करेगा, और यह प्रसंस्करण के दौरान एक सतत गिनती होगी। प्रगति पट्टी के 'शैली =' टैग के भीतर फिट करने के लिए मैं अपनी .html फ़ाइल में वर्तमान प्रगति कैसे भेज सकता हूं? अधिमानतः इस तरह से कि मैं अन्य पृष्ठों पर प्रगति सलाखों के लिए एक ही उपकरण का पुन: उपयोग कर सकता हूं। अगर मुझे पर्याप्त जानकारी प्रदान नहीं की गई है तो मुझे बताएं।
मैं कोडित उत्तर देना नहीं चाहता हूं लेकिन मुझे आपको समाधान के लिए इंगित करने देता हूं। पीडीएफ निर्यात करने के लिए धागा शुरू करना एक पारंपरिक विचार है। थ्रेड डेटाबेस तालिका में प्रगति की रिपोर्ट करता है। डेटाबेस से प्रगति मूल्य प्राप्त करने के लिए आपका ब्राउज़र फ्रंट एंड AJAX मतदान करता है। AJAX मतदान के विकल्प, आप अपने ब्राउज़र पर प्रगति मूल्य को धक्का देने के लिए फ्लास्क-सॉकेटियो को देखना चाह सकते हैं। इस विकल्प के लिए अधिक इंजीनियरिंग प्रयास की आवश्यकता हो सकती है। – chfw
@chfw का विचार यह है कि आपको इसे कैसे देखना चाहिए। लेकिन धागे की बजाय यह एक अतिरिक्त प्रक्रिया होनी चाहिए जो नौकरियों की प्रतीक्षा कर रही हो। और डेटाबेस के बजाय मैं रेडिस की तरह कुछ उपयोग करता हूं और संदेश कतारों के माध्यम से संवाद करता हूं। और अंततः AJAX या WebSockets का उपयोग करने के बजाय मैं [एसएसई] (https://developer.mozilla.org/en-US/docs/Server-sent_events) की अनुशंसा करता हूं जो सेटअप करना आसान है। – dAnjou