web.py中的动态打印
我正在把一个应用程序从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。不过这里有一些注意事项,你需要设置一些头部信息,而且不能同时使用 return
和 yield
,因为这样会把它变成一个生成器。
除了设置头部信息之外,你可以用 yield "一些更多的数据"
,这和你在CGI脚本中使用print是类似的。