我正在用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
发布于 2009-07-24 05:54:31
pexpect可以让你在没有缓冲的情况下直接获取输出。
要迅速更新用户浏览器上的信息,您需要该浏览器上的javascript向您的服务器发送适当的AJAX请求(dojo或jquery将使此变得更容易,尽管它们不是严格要求的),并在新的响应到来时更新页面--如果没有客户端协作(而JS + AJAX是获得这种协作的最简单方法),那么仅在服务器端做这件事是不明智的。
因此,一般的方法是:从浏览器发送AJAX查询,让服务器在它再有一行时立即响应,浏览器上的JS更新内容,然后立即发送另一个查询,重复此操作,直到服务器以"I'm all done“标记响应(例如,”空“响应可用于此目的)。
发布于 2009-08-03 21:15:37
您可能想要查看此faq条目。然后使用JS,您总是在编写新内容之前清除屏幕。
发布于 2009-07-24 15:10:56
我还没有在pylons上尝试过,但您可以尝试在页面上的iframe中显示慢速组件的输出(使用mime类型text/plain),并在生成时将每个块生成到iframe。为了好玩,我只是把这个放在一起作为一个简单的演示。下面是缓慢生成的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。
以下是在iframe中包含慢速页面的WHIFF配置模板:
{{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上是有效的.
https://stackoverflow.com/questions/1175748
复制相似问题