如何使用Ajax流式传输从Django写入stdout的Fabric任务结果

时间:2014-11-19 22:38:55

标签: python ajax django stream fabric

我有一个从Django执行的长期运行的Fabric任务(~30分钟)。

示例代码在这里:

from django.http import HttpResponse
from fabric.tasks import execute
from fabric.api import sudo

@task
def runcmd():
    result = sudo('ls -l')


def executer(request):
    result = execute(
        runcmd,
        hosts=['localhost']
    )
    return HttpResponse(result['localhost'])

这里的问题我不想等待30分钟显示日志(stdout)。任务完成后我可以得到结果。在任务运行时我只需要捕获标准输出并将其发送给客户端。

我尝试了StreamingHttpResponse和ajax,但没有奏效。

我该如何解决这个问题,还是有其他选择?

此致

1 个答案:

答案 0 :(得分:2)

您可以使用您自己的版本包装Fabric函数run / sudo并覆盖它们的stdout。

Docs says:

  

要覆盖用于显示远程stdout和/或stderr的本地流,请指定stdout或stderr。 (默认情况下,使用常规的sys.stdout和sys.stderr Python流对象。)

然后,您可以将StringIO(内存中类文件对象)实例传递给stdout参数。观察新行的StringIO实例,当到达新行时,您可以yield到StreamingHttpResponse(例如,参见this answer)。