这是我在这里的第一个问题,所以我希望它能正确完成;)
我被分配了一个任务,为一些“自制的”python脚本提供一个Web界面。 此脚本用于通过curl命令检查某些网站/应用程序的可用性。该脚本的一个非常重要的方面是它实时提供结果,逐行写入标准输出。
通过为此脚本提供Web界面,主要目标是可以从任何地方轻松使用脚本,例如通过智能手机。因此,Web界面必须非常基础,并且“无插件”。
我的问题是我在网上想到或发现的大多数解决方案(ajax,django,甚至是一个简单的帖子)似乎需要在将其发送到浏览器之前完整生成该页面,从而失去了这个重要的“实时” “方面。
关于如何正确地做到这一点的任何想法?
提前致谢。
答案 0 :(得分:3)
解决方案草图:
创建一个包含网页布局的HTML文件,并为脚本输出提供专用DIV:
<html>
<body>
<div id="scriptoutput"></div>
<script type="text/javascript" src="localhost:8000/runscript"/>
</body>
</html>
可以使用您希望的任何服务器提供此HTML文件。
现在,编写一个简单的http服务器来运行脚本并将每一行转换为javascript命令(例如python中):
import os
f = os.popen('ping 127.0.0.1')
for i in range(30):
ln = f.readline()
print "document.getElementById('scriptoutput').innerHTML += '<pre>%s</pre><br/>';" % ln
您可以使用任何CGI / WSGI服务器执行任务,或者如果性能不是很重要,甚至可以使用Python自己的BaseHTTPServer
类。
这可以解决问题,因为大多数浏览器会在收到Javascript脚本时解析并执行它们(而且不仅在请求完成时) - 请注意,不需要轮询或服务器端存储!
答案 1 :(得分:0)
你的任务听起来很有趣。 :-)刚想到的一个场景:你继续用你的家庭酿造脚本来掠夺资源,并将结果推送到你的持久数据库和缓存系统 - 比如Redis - 同时。在为客户端请求提供服务时,您的缓存系统/层将充当主数据源。 Redis f.e.是一个高性能的键值存储,每秒可处理100k连接。虽然只有n个最新的(例如f.e.50k条目),缓存系统只会保留这些条目,让你只专注于开发服务器端API(处理连接,处理请求,从Redis读取)和前端。前端和后端API之间的通信可以由WebSocket连接驱动。 HTML5规范的一个非常新的部分。但是,这些天已经发布了很多浏览器版本。或者你可以回退一些异步Flash Socket-stuff。 Websockets基本上允许客户端和服务器之间的持久连接;你可以注册为每个传入的数据/ -packet调用的事件监听器 - 没有无限的轮询或其他东西。
答案 2 :(得分:0)
我希望我能正确理解你的需要。
Ajax背后的想法是更新页面内容而不重新加载整个页面。我认为它应该符合你的需要。如果要对其进行Web化,则可能必须修改命令。您可能需要“即时”获取他们的打印日志。
以下是一些想法:
写一个非常简单的页面,可以执行命令(菜单,表格......)
当用户要求执行命令时,请向执行该命令的服务器发送ajax查询。
需要修改您的命令,以便将sys.stdout重定向到将打印日志存储到数据库中的内容。您可以通过为sys.stdout
分配具有write
功能的对象来完成此操作。
class MyDbLogger:
def __init__(self, ...):
"""Some initialization"""
...
def write(self, s):
"""write into the database"""
...
dbout = MyDbLogger(...)
sys.stdout = dbout
客户端会定期轮询服务器以将内容导入数据库,然后将其写入页面。
Comet无疑是一项需要进行调查的技术,以便拥有实时行为。这将避免客户端定期轮询服务器。这可能是#4的改进,但实施起来可能有点困难。
我希望它有所帮助