我有一个 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 请求上传图像,然后使用 SockJS 与 Django 进行通信。 提前致谢。
最佳答案
对于具有足够工作进程的低流量站点,您可以使用 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
在 View 中你会做类似的事情:
from django.http import StreamingHttpResponse
def my_streaming_view(request):
return StreamingHttpResponse(
content_generator(['cat', '/tmp/some_large_file.txt'])
)
当然,这可能仍然在网络或浏览器级别的其他地方进行缓冲。因此,在尝试时请确保发送大量数据。至少一兆字节的文本。因此,您可能需要考虑使用像 WebSockets 这样的协议(protocol),可以立即接收数据。
关于jquery - 使用 django 将实时控制台数据从服务器发送回客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17048402/