2016-02-07 43 views
0

我正嘗試使用pySmartDL構建基於瓶子的下載管理器。 但是,我無法在下載過程中將進度條輸出到瀏覽器。Python Bottle web應用程序在瀏覽器中實時顯示輸出

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

你必須啓動一個後臺線程在後臺下載文件...

在你的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... 
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') 

還檢查了以前問&答道所以這裏的問題:Streaming Connection Using Python Bottle, Multiprocessing, and gevent

相關問題