【问题标题】:Progress bar with long web requests带有长 Web 请求的进度条
【发布时间】:2010-10-29 12:31:09
【问题描述】:

在我正在开发的 django 应用程序中,我刚刚添加了将多个文件(总共从 50mb 开始)存档到 zip 文件的功能。目前,我正在这样做:

get files to zip
zip all files
send HTML response

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

任何想法和想法都会受到喜爱。

【问题讨论】:

    标签: python django


    【解决方案1】:

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

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

    看看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 感兴趣。我在那里得到了相当巧妙的答案。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        您可以使用“日志文件”来跟踪压缩文件,以及还剩下多少文件。

        程序方式应该是这样的:

        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 中打开和关闭文件处理程序。

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

        【讨论】:

          【解决方案4】:

          比静态页面更好的是,显示一个带有 throbber 的 Javascript 对话框(使用 Shadowbox、JQuery UI 或一些自定义方法)(您可以在 hxxp://www.ajaxload.info/ 获得一些)。您还可以在页面中显示 throbber,无需对话框。大多数用户只想知道他们的操作正在被处理,并且可以在没有可靠的进度信息的情况下生存(“请稍候,这可能需要一些时间......”)

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

          【讨论】:

          • 好的...这就是我制作进度条的方式。但是我如何让它在开始压缩文件之前吐出 HTML 呢?
          • 使用 AJAX 完成所有工作。在会话中跟踪任务,以便您可以在他们离开时重新创建回调和状态跳动者。
          • 确实如此。您可以使用 jQuery.post() 或 jQuery.get() 发出 AJAX 请求,检索您需要的内容并更新状态。如果您想轻松解析响应,请使用 JSON 对象(只需 eval() 检索的数据,并且您有一个常规的 Javascript 对象)。它可以包含百分比以及正在运行的操作的文字描述。
          • 但是如何返回 HTML,然后继续存档文件?
          猜你喜欢
          • 2020-04-20
          • 1970-01-01
          • 2012-05-18
          • 1970-01-01
          • 1970-01-01
          • 2013-10-08
          • 2015-03-31
          • 2010-10-22
          • 2016-09-30
          相关资源
          最近更新 更多