2009-05-28 90 views
3

在我工作的Django應用程序,我剛纔已經加入到歸檔大量文件(共50MB開始)到一個zip文件的能力。目前,我這樣做是這樣的:長網進度條要求

get files to zip 
zip all files 
send HTML response 

顯然,這導致了大量的等待文件被壓縮的第二行。我能做些什麼來使這個過程對用戶來說更好?雖然有一個進度條會是最好的,即使它只是返回一個靜態頁面,說'請稍等'或其他。

任何想法和想法都會被喜歡。

回答

3

你應該牢記顯示進度條可能不是一個好主意,因爲你可以得到超時或讓你的服務器從提交大量的併發請求的困擾。

把荏苒任務隊列中,並讓它回調以某種方式通知用戶 - 通過電子郵件,例如 - 這個過程已經完成。

看看django-lineup

你的代碼看起來很像:

from lineup import registry 
from lineup import _debug 

def create_archive(queue_id, queue): 
    queue.set_param("zip_link", _create_archive(resource = queue.context_object, user = queue.user)) 
    return queue 


def create_archive_callback(queue_id, queue): 
    _send_email_notification(subject = queue.get_param("zip_link"), user = queue.user) 
    return queue 

registry.register_job('create_archive', create_archive, callback = create_archive_callback) 

在你的意見,通過創建排隊的任務:

from lineup.factory import JobFactory 
    j = JobFactory() 
    j.create_job(self, 'create_archive', request.user, your_resource_object_containing_files_to_zip, { 'extra_param': 'value' }) 

然後運行隊列處理器(大概內置的屏幕會話):

./manage.py run_queue 

哦,關於這個問題,你可能也對estimating zip file creation time感興趣。那裏有非常漂亮的答案。

0

比一個靜態頁面更好,顯示一個Javascript對話框(使用Shadowbox,JQuery UI或一些自定義方法)與跳動(你可以得到一些在hxxp://www.ajaxload.info/)。您也可以在頁面中顯示跳躍者,而不用對話框。大多數用戶只是想知道他們的行動被處理,並能生活在沒有可靠的進度信息(「請稍候,這可能需要一些時間......」)

jQuery UI的也有一個進度條API。您可以定期對您網站上的已啓用頁面進行AJAX查詢以獲取進度報告並相應地更改進度欄。根據存檔運行的頻率,有多少用戶可以觸發它,以及如何驗證用戶身份,這可能非常困難。

+0

好吧...所以這就是我如何使進度條。但是我怎麼才能在開始壓縮文件之前把它吐出HTML呢? – 2009-05-28 09:31:02

0

你可以使用「日誌文件」來跟蹤壓縮文件,以及有多少文件仍然存在。

該程序的方法應該是這樣的:

  1. 計數文件的數字,它在一個文本文件中寫,在格式像totalfiles.filespreocessed
  2. 的每個文件都壓縮,只需更新文件

所以,如果你要壓縮3個文件,日誌文件將成長爲:

3.0 -> begin, no file still processed 
3.1 -> 1 file on 3 processed, 33% task complete 
3.2 -> 2 file on 3 processed, 66% task complete 
3.3 -> 3 file on 3 processed, 100% task complete 

然後用一個簡單的ajax函數(間隔)每秒檢查一次日誌文件。

在python中,打開,閱讀和成文件這樣的小文件應該很快,但如果你有很多用戶在同一時間做這些事情,可能會造成一些請求麻煩,但顯然你需要創建每個請求的日誌文件,可能帶有rand名稱,並在任務完成後將其刪除。

一個問題可能是,爲了讓ajax讀取日誌文件,您需要在每次更新python時打開並關閉文件處理程序。

最終,對於更精確的進度計,您甚至可以使用文件大小而不是文件數作爲參數。