web.py中的动态打印

0 投票
2 回答
853 浏览
提问于 2025-04-16 21:45

我正在把一个应用程序从cgi转移到web.py。在cgi中,我用简单的print语句动态地获取结果并打印出来。所以结果是在页面完全加载之前就已经打印出来了。在web.py中,我有一个return语句,但我不知道怎么才能做到和之前一样。

下面是一个cgi的示例代码:

print "<p><b>Displaying Search Results</b></p>"
print "<table>"
cmd = subprocess.Popen(["find", location ,"-name", fileName], stdout=subprocess.PIPE)
for line in cmd.stdout:
    tableData=line.rstrip("\n")
    tableRow="<tr><td>tableData</td></tr>"
    print tableRow
print "</table>"

上面的代码会在生成每一行时就打印出来。我该怎么在web.py中写出同样的效果呢???

2 个回答

1

虽然你可以通过把 print 替换成拼接和一个返回值来简化移植,但建议使用一个模板引擎(web.py 有一个内置的模板引擎,叫做 Templetor)。

把逻辑和展示分开,这样你就可以更轻松地修改其中一个,而不用担心另一个会受到影响。

2

你可以选择使用一个字符串,把数据一个个加到这个字符串里,最后再返回这个字符串:

s = "My page with..."
s += "More data"
for y in x:
    s += "And this!"
return s

或者你可以使用一种叫做“生成”的方式来输出数据,具体可以参考这个链接:http://webpy.org/cookbook/streaming_large_files。不过这里有一些注意事项,你需要设置一些头部信息,而且不能同时使用 returnyield,因为这样会把它变成一个生成器。

除了设置头部信息之外,你可以用 yield "一些更多的数据",这和你在CGI脚本中使用print是类似的。

撰写回答