我在Pylons中编写一个应用程序,它依赖于某些系统命令的输出,例如traceroute。我希望在生成命令时显示命令的输出,而不是等待它完成然后立即显示。
我找到了如何在Python中访问该命令的输出并回答了这个问题:
How can I perform a ping or traceroute in python, accessing the output as it is produced?
现在我需要找到一种方法来在浏览器生成时将此信息提供给浏览器。我打算使用jQuery的loadContent()将脚本的输出加载到。问题是Pylons控制器使用return
所以输出必须在Pylons呈现页面之前完成,并且Web服务器用内容响应客户端。
有没有办法让页面显示内容,因为它是在Pylons中生成的,还是必须使用Pylons之外的脚本来完成?
基本上,我正在尝试这样做: http://network-tools.com/default.asp?prog=trace&host=www.bbc.co.uk
答案 0 :(得分:1)
pexpect
会让你得到输出,没有缓冲。
要在用户的浏览器上及时更新信息,您需要在该浏览器上发送javascript,向您的服务器发送适当的AJAX请求(dojo或jquery将使这更容易,但不是严格要求)并在新响应时更新页面 - 没有客户端合作(而JS + AJAX是获得这种合作的最简单方式),单凭服务器端就没有合理的方法。
所以一般的方法是:从浏览器发送AJAX查询,让服务器响应,只要它还有一行,浏览器上的JS更新内容然后立即发送另一个查询,重复直到服务器响应“我是全部完成“标记(例如”空“响应可能适用于此目的)。
答案 1 :(得分:1)
您可能需要查看此faq条目。然后使用JS,在编写新内容之前总是清除屏幕。
答案 2 :(得分:0)
我还没有尝试过使用pylons,但你可以尝试在页面上的iframe中显示慢组件的输出(使用mime type text / plain),并在生成时将每个chunk产生到iframe。为了好玩,我把它放在一起作为一个 WHIFF演示。这是缓慢生成的web内容wsgi应用程序:
import time
def slow(env, start_response):
start_response("200 OK", [('Content-Type', 'text/plain')])
return slow_generator()
def slow_generator():
yield "slowly generating 20 timestamps\n"
for i in range(20):
yield "%s: %s\n" % (i, time.ctime())
time.sleep(1)
yield "done!"
__wsgi__ = slow
此文件部署在我的笔记本电脑上: http://aaron.oirt.rutgers.edu/myapp/root/misc/slow。
这是WHIFF配置模板,其中包含慢速页面 iframe中:
{{env whiff.content_type: "text/html"/}}
Here is an iframe with slowly generated content:
<hr>
<iframe frameborder="1" height="300px" width="300px" scrolling="yes"
style="background-color:#99dddd;"
src="slow"
></iframe>
<hr>
Isn't that cool?
这部署在我的笔记本电脑 http://aaron.oirt.rutgers.edu/myapp/root/misc/showSlowly。
嗯。我刚刚尝试了Safari中的上述链接并且它无法正常工作......显然存在一些浏览器差异......似乎至少在Firefox上工作......