如何将Python命令行脚本转为Web接口?
这是我在这里的第一个问题,希望能顺利解决;)
我被分配了一个任务,要给一个“自制”的Python脚本做一个网页界面。这个脚本的作用是通过curl命令检查一些网站或应用的可用性。这个脚本一个很重要的特点就是它能实时输出结果,一行一行地写到标准输出上。
给这个脚本做网页界面的主要目的是让它可以在任何地方方便使用,比如通过智能手机。所以这个网页界面必须非常简单,并且要“无插件”运行。
我遇到的问题是,我想到或在网上找到的大多数解决方案(比如ajax、django,甚至一个简单的post)似乎都需要在发送到浏览器之前先生成完整的页面,这样就失去了这个重要的“实时”特性。
有没有什么好的办法可以正确实现这个呢?
提前谢谢大家。
3 个回答
我希望我能正确理解你的需求。
Ajax的主要思想是更新页面内容,而不需要重新加载整个页面。我觉得这应该符合你的需求。如果你想把你的命令变成网页功能,可能需要对它们进行一些修改。你可能需要实时获取它们的打印日志。
这里有一些建议:
写一个非常简单的页面,能够执行命令(比如菜单、表单等)。
当用户请求执行命令时,发送一个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
客户端会定期向服务器请求数据,将数据库中的内容写入页面。
Comet技术是值得研究的,它可以实现实时更新,这样就不需要客户端定期去请求服务器。这可以作为对第4点的改进,但可能会稍微难一些。
希望这些对你有帮助。
你的任务听起来很有趣。:-) 我想到一个场景:你可以用自己写的脚本不断抓取资源,然后把结果同时放进一个持久化的数据库和一个缓存系统,比如Redis。这个缓存系统就像是你处理客户请求时的主要数据来源。Redis是一个高性能的键值存储,可以每秒处理10万个连接。虽然其实只有最新的n条数据(比如说5万条)是重要的,但缓存系统只会保存这些数据,这样你就可以专心开发服务器端的API(处理连接、处理请求、从Redis读取数据)和前端。前端和后端API之间的通信可以通过WebSocket连接来实现。这是HTML5规范中比较新的部分,不过现在很多浏览器都已经支持了。或者,你也可以使用一些异步的Flash Socket技术。WebSocket基本上允许客户端和服务器之间保持持久连接;你可以注册事件监听器,这样每当有数据包到达时就会调用这个监听器——不需要不停地轮询或其他复杂的操作。
解决方案的简单草图:
首先,创建一个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脚本时就会解析和执行它们,而不是等到请求完成后才执行——这意味着你不需要轮询或者服务器端存储!