进度条通过Python CGI

时间:2013-09-09 12:56:54

标签: python html progress-bar cgi

#!/usr/bin/env python

import time
import sys
import os
for i in range(10):
    progress_bar = \
        """
        <!DOCTYPE html>
        <html>
        <body>
        <p>Display a gauge:</p>
        <meter value="%s" min="0" max="10">2 out of 10</meter><br>
        </body>
        </html>
        """%(i)

    print  progress_bar
    sys.stdout.flush() # do this after the print
    time.sleep(1.0)

这里我试图创建一个进度条,其中'i'是进度指示器。 enter image description here。屏幕截图如下。我所期望的是,通过使用sys.stdout.flush(),可以消除以前的HTML打印,仅保留当前“i”的进度,但它不起作用。任何想法如何达到我的目标?

1 个答案:

答案 0 :(得分:5)

您的Python脚本正在生成一个最终由浏览器读取的HTML文件。如果在浏览器中单击“查看源代码”,则应该看到在控制台中运行Python脚本时会看到的相同内容。

这应该清楚为什么一个print语句不会“覆盖”另一个。就浏览器而言,它正在读取静态内容,就像您只是将HTML文件放在Web服务器上一样。唯一的区别是使用Python可以生成那个你想要的HTML文件。

要创建在浏览器中显示为动态的进度条,您需要使用客户端脚本(Javascript)。

如果要表明进度的进程是服务器端(Python),那么基本方法可能是这样的:

  • 创建一个Python脚本,它提供一些信息(以JSON,纯文本或任何方便的方式),它们指示操作的进度,例如:{"finished": false, "progress": 54.9, "target": 100.0}
  • 等JSON文档
  • 制作一个Javascript函数,根据数字设置您的进度条的可视状态。
  • 创建一个Javascript函数,该函数对Python端进度服务脚本的URL执行请求,并解析返回的信息。
  • 将这些碎片连接在一起。当操作正在进行时,定期轮询服务器以查看其进度并相应地设置进度条。

如果实际知道(或者可以猜测,而不是完全担心反映现实的指标)操作将花费一定的时间,您可以简单地跳过很多使Javascript进度指示符取决于时间而不是正在进行的操作的实际状态。