带有“流文本”的Python脚本的Web接口

2 投票
2 回答
1760 浏览
提问于 2025-04-16 05:43

我有一个Python命令行脚本,运行时间可能会很长(从5秒到5分钟不等),这取决于它进行的检查。这个脚本使用了很多命令行参数,有些是必须的,大多数是可选的。

我想把这个脚本“网络化”,也就是说希望能通过网页访问它,但不想改动核心的Python脚本,而是通过其他东西来启动它(比如另一个Python脚本)。

我之前用过mod_python和Apache,所以写一个生成网页、带有表单和提交按钮的Python脚本来运行我的核心Python脚本并不算太难。

问题在于核心Python脚本的输出。我不想等到它完成后再显示输出,而是希望它一生成一行,就能在网页界面上显示出来,类似于在一个DIV中实时显示文本。

我知道如何通过HTML页面中的JavaScript或外部JavaScript文件来实现这个,但不知道如何通过另一个程序的输出做到这一点。

有没有什么办法可以实现这个?我更倾向于使用Python和Apache,但如果真的需要其他东西(比如PHP、AJAX、JavaScript等),我也能接受。


根据whatnick的建议,我尝试把核心Python脚本的输出重定向到一个临时文件,然后用我在网上找到的AJAX日志文件查看器代码来显示这个文件。

这个方法有点效果,但还是有一些缓冲,因为在“日志尾部页面”中,输出的行是分成几块显示的,而不是一行一行显示。这很可能是因为AJAX脚本使用定时器每隔X毫秒(在脚本中可以配置,用于JavaScript定时器)重新加载日志文件。即使我把这个时间调低,仍然不够快,因为我的核心脚本有时会很快输出几行内容。

2 个回答

0

在IE和Firefox浏览器中,如果你把响应内容分段发送,它会在整个页面内容还没完全到达之前就开始显示。这意味着你可以在HTML文件的中间部分显示一些正在进行的日志信息。一旦处理完成,你再正常地显示页面的其余部分。

不过,要让普通的Python模板引擎适应这种方式,你可能需要做一些复杂的调整,因为这些模板引擎通常都是一次性处理所有内容。

而Chrome似乎对这种做法不太友好(我猜这可能和它使用的webkit有关,所以Safari也可能不适用这种方法),至于Opera,我就不太确定了。

1

你可以把长脚本的输出记录到一个文件里,然后用一个基于JavaScript的定时器代码定期去读取、解析并显示这个日志的内容。如果一次性读取整个日志太多了,你也可以让一个更小、更快的服务器端Python脚本来解析日志,并把最新的部分传给调用的JavaScript。这就是嵌入式设备中路由器日志等内容显示的方式。

祝你好运。这里有一个关于 JavaScript定时器的小教程。

撰写回答