2009-05-28 51 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时打开并关闭文件处理程序。

最终,对于更精确的进度计,您甚至可以使用文件大小而不是文件数作为参数。