如何使用 Ajax 流式传输从 Django 写入 stdout 的 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 分钟显示日志(标准输出)。我可以在任务完成后得到结果。我只需要在任务运行时捕获标准并将其发送到客户端。

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

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

问候

你可以用你自己的版本包装 Fabric 函数 run/sudo,并在那里覆盖它们的 stdout。

文档 说:

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

然后,可以将 StringIO(类似内存中的文件的对象)实例传递给 stdout 参数。观察 StringIO 实例中的新行,当新行到达时,您可以将其yield到 StreamingHttpResponse 中(有关示例,请参阅此答案)。

相关内容

  • 没有找到相关文章

最新更新