Web上的Python:在处理代码时执行代码?

时间:2011-05-27 03:10:51

标签: python cgi

我制作了一个我想要部署到网络上的python应用程序。我在Mac上,所以我启用了Web服务器并将其放在我的cgi-bin中,它运行正常。问题是,应用程序进行了一些密集的计算,我真的想让用户知道正在执行的是什么。

即使我在代码中散布了print语句,但在完成整个操作之前,它不会向浏览器输出任何内容。有没有办法解决这个问题,以便在处理代码时执行代码?

3 个答案:

答案 0 :(得分:1)

您可能想尝试

而不是'print'
sys.stdout.write('something something something')
sys.stdout.flush()

这将确保Web服务器不等待缓冲区填满。

答案 1 :(得分:1)

如果sys.stdout.flush()没有做到这一点,那么问题很可能通过分块编码传输来解决。

为了给出一点背景知识,chunked-encoding定义了一种机制,在这种机制中,服务器预先告诉客户端“我的数据流没有限制”,并且作为一种效率,数据以块的形式传输,而不仅仅是流媒体内容不知不觉。

这是一个简单的例子,重要的是你如何发送你使用的数据和标题。

这方面的另一个方面是浏览器实际上对数据进行了,即使你的cgi正在向浏览器发送数据,它可能只是坐在它上面直到它完成。

通过以下示例,curl显示正在流中正确下载的每个“块”,Safari仍然会等待CGI完成。

#!/usr/bin/python
import time
import sys

def chunk(msg=""):
    return "\r\n%X\r\n%s" % ( len( msg ) , msg )

sys.stdout.write("Transfer-Encoding: chunked\r\n")
sys.stdout.write("Content-Type: text/html\r\n")

for i in range(0,1000):
    time.sleep(.1)
    sys.stdout.write( chunk( "%s\n" % ( 'a' * 80 ) ) )
    sys.stdout.flush()

sys.stdout.write(chunk() + '\r\n')

因此,如果您只是使用浏览器连接到此CGI,是的,您将看不到任何更改 - 但是如果您使用AJAX技术并在每次获取数据时设置处理程序,您将能够“流式传输”它因为它进来了。

答案 2 :(得分:1)

可能是解决问题的最佳方法。创建一个ajax-drive“控制台”类型的显示,例如,它将轮询一个日志文件,该文件在工作进程中写入。