如何使用Pylons显示慢速脚本的更新输出?

时间:2009-07-24 04:26:27

标签: python pylons

我在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

3 个答案:

答案 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上工作......