我有一个简单的工作流[Step 0]->[1]->[2]->...->[Step N]
。主程序知道它当前所处的步骤(状态)。
我希望将这个实时流式传输到一个网站(在局域网中),这样当我的同事打开时,比如http://thecomputer:8000
,他们就能看到我们工作流当前状态的实时呈现有任何相关细节。
我已经考虑将脚本的状态写入StringIO
对象(流式传输到它)并使用Javascript
刷新浏览器,但老实说我真的不知道如何实际执行此操作
有什么建议吗?
答案 0 :(得分:1)
您可以让python脚本编写一个xml文件,您可以在网页中找到ajax请求,并从中获取状态信息。
答案 1 :(得分:0)
如果您只是一个快速的解决方案而不是一个完整的网页,请查看SimpleHTTPServer您可以将文件形式的状态信息写入目录,然后更新以供其他人查看。
不漂亮,但非常快速而且非常容易。
对于演示,只需键入python -m SimpleHTTPServer
这将创建一个地址为http://[your computer's name or IP]:8000
的网页,其中包含启动时当前工作目录的内容。这些文件是热链接的。如果单击某个文件,它将显示在浏览器中;如果单击目录,则更改为该目录并列出其内容。
供您使用时,您可以从空目录开始,并创建与您要报告的步骤匹配的文件。您可以将文件命名为您的步骤,例如“step 1.txt”,以及该文件中的更详细信息。步骤1可以是脚本在步骤1完成时创建的目录,等等。
或者,查看Twisted,这将允许您直接从Python脚本提供HTTP请求。
如果/想要变得更加漂亮,可以使用基本相同的方法。从python脚本中,将输出写入空目录中的文件。从带有PHP的Web服务器,编写一个简单的脚本来检查该目录并显示找到的内容。将页面上的刷新间隔设置为某个值,它将在查看器的浏览器中自行更新。
答案 2 :(得分:0)
我不知道Python是如何工作的,但如果它是PHP,这将很容易(如果你知道你应该做什么)。
假设我的应用程序是myapp.py,它从第1步到第N步。我会让它返回(简单文本),一个数字。这个数字是它的'步数。例如,如果我调用http://localhost/myapp.py,它将返回5. 30分钟后,我重新加载页面,它返回15。
现在来看JavaScript的事情。我会建议使用jQuery。它使事情变得更容易,更快捷。我所要做的只是
$('#streaming').load('http://localhost/myapp.py');
这会将页面内容加载到ID = streaming的DIV。但只有在加载页面时才会发生这种情况。要使其每x秒发生一次,请使用JavaScript settimeout函数。
var t=setTimeout("javascript statement",milliseconds);
最好将加载步骤的部分存储在函数中,并在页面加载时使用setTimeout调用它。一旦脚本停止工作(使用特殊数字/消息),它也有助于停止setTimeout。
答案 3 :(得分:0)
使用纯JavaScript,您可以选择Comet,WebSockets和Ajax。然而,我对这些中的任何一个都不太了解。看看其中一些网站:
http://en.wikipedia.org/wiki/Comet_(programming)
据我所知,Comet只涉及向Web服务器发出长期的Ajax请求,脚本可以根据需要推送数据。 WebSockets仅在某些浏览器的最新版本中受支持。最简单的解决方案是Omar Abid所建议的:通过Ajax每隔一段时间轮询一次Web服务器。
答案 4 :(得分:0)
您可以向应用程序添加一个服务器实例,该实例响应给定端口上的查询以及您的应用程序决定共享的内容。在可以访问应用程序状态信息的单独线程中启用此功能,然后让您的网页或监控程序向该端口发送请求。当然,您可以通过不同方式响应不同的请求。您需要的所有信息都在https://pymotw.com/3/socket/tcp.html上,但以下代码可以帮助您入门:
# borrowed from https://pymotw.com/3/socket/tcp.html
import socket
import sys
# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Bind the socket to the port
# (the host name used will need to be pingable from the requesting service)
server_address = ('', 10000)
print('starting up on {} port {}'.format(*server_address))
sock.bind(server_address)
# Listen for incoming connections
sock.listen(1)
while True: # add a terminator based on your application state
# Wait for a connection
print('waiting for a connection')
connection, client_address = sock.accept()
try:
print('connection from', client_address)
# Receive the data in small chunks and retransmit it
while True:
data = connection.recv(16)
# print('received {!r}'.format(data))
if data: # add a check to ensure the request is valid
print('sending data back to the client')
data = 'Current application state is:' + getStatus()
connection.sendall(data.encode())
else:
print('no data from', client_address)
break
finally:
# Clean up the connection
connection.close()