如果一个python命令行脚本?
这是我的第一个问题,所以我希望它能正确完成;)
我已经被分配了任务来给一些“自制的”python脚本提供一个web界面。 该脚本用于通过curl命令检查一些网站/应用程序的可用性。 这个脚本的一个非常重要的方面是它实时给出结果,逐行写入标准输出。
通过为该脚本提供Web界面,主要目标是可以从任何地方轻松使用该脚本,例如通过智能手机。 所以Web界面必须非常基本,并且“无插件”工作。
我的问题是,我认为或发现在网络上的大多数解决方案(ajax,Django,甚至是一个简单的帖子)似乎都需要整个一代的页面发送到浏览器之前,失去了这个重要的“实时”方面。
任何想法如何正确地做到这一点?
提前致谢。
解决方案的草图:
创建一个包含您的网页布局的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服务器,或者如果性能BaseHTTPServer
,甚至可以使用Python自己的BaseHTTPServer
类。
这可以做到这一点,因为大多数浏览器在收到Javascript脚本时都会解析并执行JavaScript脚本(而不仅仅是在请求完成时) - 请注意,不需要轮询或服务器端存储!
你的任务听起来有趣。 :-)一个刚刚想到的场景:您不断用自制脚本来抓取资源,并将结果推送到持久性数据库和缓存系统 - 如Redis--同时进行。 服务客户端请求时,缓存系统/层作为主要数据源。 Redis是一款高性能的关键值存储,每秒能够处理100k个连接。 尽管只有n个最新的(比如fe 50k条目)对缓存系统有影响,但它只能保存这些条目,并且让您专注于开发服务器端API(处理连接,处理请求,从Redis中读取)和前端。 前端和后端API之间的通信可以由WebSocket连接驱动。 HTML5规范的新部分。 然而,尽管如此,这些日子已经被许多浏览器版本所支持。 或者,你可以回退一些异步Flash Socket的东西。 Websockets基本上允许客户端和服务器之间的持久连接; 您可以注册为每个传入数据/分组调用的事件侦听器 - 不需要无尽的轮询或其他内容。
我希望我能正确理解你的需求。
Ajax背后的想法是更新页面的内容而不重新加载整个页面。 我认为它应该符合你的需要。 如果您想对它们进行Web化,您可能必须修改您的命令。 您可能需要“即时获取”他们的打印日志。
这里有一些想法:
写一个非常简单的页面,可以执行命令(菜单,窗体...)
当用户要求执行命令时,向执行该命令的服务器发送一个ajax查询。
您的命令需要修改,以便将sys.stdout重定向到将打印日志存储到数据库中的东西。 您可以通过将具有write
功能的对象分配给sys.stdout
来完成此操作。
class MyDbLogger:
def __init__(self, ...):
"""Some initialization"""
...
def write(self, s):
"""write into the database"""
...
dbout = MyDbLogger(...)
sys.stdout = dbout
客户端将通过长时间轮询服务器来获取内容到数据库中,然后将其写入页面。
彗星肯定是要进行调查才能有实时行为的技术。 这将避免客户定期轮询服务器。 这可能是对#4的改进,但实施起来可能更难一些。
我希望它有帮助
链接地址: http://www.djcxy.com/p/2069.html