如果一个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

    上一篇: ifing a python command line script?

    下一篇: bash find chained to a grep which then prints