具有长Web请求的进度条

时间:2009-05-28 08:38:59

标签: python django

在我正在开发的django应用程序中,我刚刚添加了将一些文件(总共50mb)归档到zip文件的功能。目前,我正在做这样的事情:

get files to zip
zip all files
send HTML response

显然,这会导致文件被压缩的第二行等待。我该怎么做才能让这个过程对用户更好?虽然有一个进度条是最好的,即使它只是返回一个静态页面说“请等待”或其他什么。

任何想法和想法都会被爱。

4 个答案:

答案 0 :(得分:4)

您应该记住,显示进度条可能不是一个好主意,因为您可能会遇到超时或让您的服务器遭受提交大量同时请求的困扰。

将压缩任务放入队列并让它回调以通过某种方式通知用户 - 例如通过电子邮件 - 该流程已完成。

查看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感兴趣。我在那里得到了很好的答案。

答案 1 :(得分:1)

有趣的事实:您可以使用进度条诱使用户认为事情进展比实际情况要快。

http://www.chrisharrison.net/projects/progressbars/index.html

答案 2 :(得分:0)

优于静态页面,使用throbber显示Javascript对话框(使用Shadowbox,JQuery UI或某些自定义方法)(您可以在hxxp://www.ajaxload.info/上获得一些)。您还可以在没有对话框的情况下在页面中显示笨蛋。大多数用户只想知道他们正在处理他们的行为,并且可以在没有可靠进度信息的情况下生活(“请稍等,这可能需要一些时间......”)

JQUery UI还有一个进度条API。您可以定期对网站上的已完成页面进行AJAX查询,以获取进度报告并相应地更改进度条。根据存档的运行频率,可以触发的用户数以及验证用户的方式,这可能非常困难。

答案 3 :(得分:0)

您可以使用“日志文件”来跟踪压缩文件以及仍有多少文件。

程序方式应如下:

  1. 计算文件数量,将其写入文本文件,格式为totalfiles.filespreocessed
  2. 您压缩的每个文件,只需更新文件
  3. 即可

    因此,如果您必须压缩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中打开和关闭文件处理程序。

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