显示PYTHON CGI脚本的进度
我有一个PYTHON的CGI脚本(内容类型:text/plain),执行大约需要10分钟。
我想在浏览器中查看脚本的执行状态。
像下面这样:
脚本第1部分执行中...
脚本第2部分执行中...
脚本第3部分执行中...
执行完成
我在使用打印语句,但是它只会在脚本执行完毕后一次性输出所有的打印内容,而不是一个一个地显示。
请帮帮我……
3 个回答
试着把输出分成几部分逐步发送,而不是一次性返回完整的响应。你在使用什么网页框架吗?Web.py 有个不错的例子。正如他们所说,
[...] 你需要确保添加 Transfer-Encoding: chunked 这个头信息,这样才能正确显示。如果不这样做,浏览器会在显示之前先把所有数据都缓存起来。
如果你没有使用 web.py 或其他网页框架,你也可以试试这样做——不过我不确定是否有效。
我觉得真正的问题可能出在网关(也就是网络服务器)上,而不是你的CGI应用程序。网关需要检查响应,确保它符合网关和客户端之间使用的HTTP版本。
我不确定网关是否允许在处理完所有请求之前就转发头信息。如果你查看一下CGI规范的第3.1节“服务器责任”,你会看到以下内容:
服务器必须对客户端请求的数据进行必要的转换和协议转换。此外,即使CGI脚本没有遵循这个规范,服务器仍然有责任遵循相关的网络协议。
如果你的脚本运行时间很长,并且你想要定期更新,那你最好重新考虑一下你的架构。可以看看一些经典的解决方案,比如让脚本在后台运行,写入数据库,然后写一些AJAX代码从服务器获取通知。根据你使用的服务器架构,你也可以考虑使用WebSocket,这样可以保持一个持续的连接,随时发送更新。
试试这样做:
import sys
...
print "Part 1 of script executed..."
sys.stdout.flush() # do this after the print
这会清空标准输出的缓存,这可能是你遇到问题的原因之一。此外,很可能是你的浏览器或网络服务器导致了这种情况,如果是这样,解决这个问题就会更困难。
我不太确定你想要实现什么,但你可以考虑使用AJAX来异步地执行你的脚本,然后再异步地加载数据回来。这样做对于浏览器和网络服务器来说处理起来会更好,而不是让一个CGI脚本运行几分钟。