使用django将实时控制台数据从服务器发送回客户端

时间:2013-06-11 15:47:34

标签: jquery python django

我在服务器上运行了一个django应用程序,我通过python运行可执行文件。 我希望发送该可执行文件的输出,因为我不希望可执行文件首先完成并将整个数据发送到一个http响应中,而是我希望将输出分成多个部分,以便客户端知道发生了什么服务器端。

我不知道从哪里开始,以及如何继续完成这项工作。任何帮助将不胜感激。

现在我正在做一些非常简单的事情:

popen=subprocess.Popen(list,stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output,errdata=popen.communicate() #this waits for the executable to finish
return output,errdata

编辑1: 现在我已经创建了一个用户可以选择多个图像的网站,然后我将其作为XML HTTP Post请求发送。可执行文件使用这些图像来做一些事情,然后返回响应。服务器是运行带有mod_wsgi的Django的Apache服务器。

在aychedee在他自己的回答中提出的一条评论中,他建议使用SockJS或SocketIO与Django一起模拟websockets。

我不确定,这是怎么回事。我是否能够通过HTTP Post请求上传图像,然后使用SangJS与Django进行通信。 提前谢谢。

1 个答案:

答案 0 :(得分:2)

对于具有足够工作进程的低流量站点,您可以使用StreamingHttpResponse provided in Django 1.5

你必须为它提供一个发电机。

import os
import subprocess
PIPE = subprocess.PIPE

def content_generator(command):
    subprocess.Popen(command, stdout=PIPE, stderr=PIPE)
    content = None
    while content != '':
        content = os.read(process.stdout.fileno(), 1024)
        yield content

在视图中,您可以执行以下操作:

from django.http import StreamingHttpResponse

def my_streaming_view(request):
    return StreamingHttpResponse(
         content_generator(['cat', '/tmp/some_large_file.txt'])
    )

当然,这可能仍会在其他地方,网络或浏览器级别进行缓冲。因此,在进行实验时,请确保您要发送大量数据。至少一兆字节的文字。因此,您可能需要考虑使用WebSockets等协议来立即接收数据。