我正在尝试使用pySmartDL构建基于瓶子的下载管理器。 但是,我无法在下载过程中将进度条输出到浏览器。
app.py
from bottle import route, run, debug, template, request, static_file, error
import os
from pySmartDL import SmartDL
@route('/static/:filename#.*#')
def send_static(filename):
return static_file(filename, root='./static/')
@route('/',method='GET')
def index():
return template('index.tpl')
@route('/download/', method='POST')
def result():
if request.POST.get('url','').strip():
url = request.POST.get('url', '').strip()
#url = "http://mirror.ufs.ac.za/7zip/9.20/7za920.zip"
dest = "C:\\Downloads\\" # or '~/Downloads/' on linux
obj = SmartDL(url, dest)
obj.start(blocking=None)
# [*] 0.23 Mb / 0.37 Mb @ 88.00Kb/s [##########--------] [60%, 2s left]
path = obj.get_dest()
out = template('out',out=obj.get_progress_bar(length=20),path=path)
return out
@error(500)
def mistake500(code):
return '<h3>Error!</h3>'
debug(True)
run(host='localhost', port=8080)
下载文件后,#############将立即打印在浏览器中。
out.tpl
% include('header.tpl', title='VTU Results Hub')
<table class="pure-table">
{{out}}
{{path}}
</table>
% include('footer.tpl')
有没有办法让我可以在浏览器的实时显示进度条。
答案 0 :(得分:0)
您必须启动后台线程,在后台下载文件...
在您的HTML放置中(将每5秒刷新一次)
<meta http-equiv="refresh" content="5; URL=http://www.yourdomain.com/status/">
在.py文件中创建状态处理程序并发布更新...
@route('/status/', method='GET')
def result():
#get the bar and return your template again...
答案 1 :(得分:0)
您可以使用gevents
的异步事件处理在服务器端执行此操作。实际上,bottlepy文档在http://bottlepy.org/docs/dev/async.html处有一个示例:
from gevent import monkey; monkey.patch_all()
from time import sleep
from bottle import route, run
@route('/stream')
def stream():
yield 'START'
sleep(3)
yield 'MIDDLE'
sleep(5)
yield 'END'
run(host='0.0.0.0', port=8080, server='gevent')
同时查看先前询问的&amp;在这里回答了问题:Streaming Connection Using Python Bottle, Multiprocessing, and gevent