1

我有一个 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 一起使用来模拟 websocket。

我不确定,它是如何工作的。我是否能够通过 HTTP Post 请求上传图像,然后使用 SockJS 与 Django 进行通信。提前致谢。

4

1 回答 1

3

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

你必须为它提供一个生成器。

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 这样的协议,在该协议中数据将立即被接收。

于 2013-06-11T16:22:30.820 回答