【问题标题】:Python on the web: executing code as it's processed?网络上的 Python:在处理代码时执行代码?
【发布时间】:2011-05-27 03:10:51
【问题描述】:

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

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

【问题讨论】:

  • 欢迎来到万维网。 ;-) 通常,浏览器会等到收集到所有输入后再呈现页面。要获得实时更新将需要更复杂的东西,例如 AJAX/Comet 技术。
  • 谢谢...昨天读了一些书;尝试了隐藏的 iframe 技术和 AJAX,但没有运气

标签: python cgi


【解决方案1】:

您可能想尝试一下,而不是“打印”

sys.stdout.write('something something something')
sys.stdout.flush()

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

【讨论】:

【解决方案2】:

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

为了提供一点背景知识,分块编码定义了一种机制,其中服务器会预先告诉客户端“我的数据流没有限制”,作为一种效率,数据以块的形式传输,而不仅仅是流式传输内容。

这是一个简单的示例,重要的是您如何发送数据和您使用的标头。

另一方面是浏览器实际处理传入的数据,即使您的 cgi 正在向浏览器发送数据,它也可能会一直停留在它上面直到完成。 p>

通过以下示例,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 技术并在每次获取数据时设置一个处理程序,您将能够“流式传输”它当它进来时。

【讨论】:

  • 越来越近了!现在它在处理标题后立即发送确认回复......但仍然将我的其余文本组合在一起,不知道为什么
  • 实际上,这适用于 Firefox,但不适用于 Chrome :( 我读到 msg 长度应该是十六进制的,但这并没有解决它。
  • 对于 Chrome 和 Safari,请查看 stackoverflow.com/questions/169258/… - webkit 似乎有些愚蠢。祝你好运!
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    相关资源
    最近更新 更多