我有一个从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 中(有关示例,请参阅此答案)。