我有一个从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,但没有奏效。
我该如何解决这个问题,还是有其他选择?
此致
答案 0 :(得分:2)
您可以使用您自己的版本包装Fabric函数run / sudo并覆盖它们的stdout。
要覆盖用于显示远程stdout和/或stderr的本地流,请指定stdout或stderr。 (默认情况下,使用常规的sys.stdout和sys.stderr Python流对象。)
然后,您可以将StringIO(内存中类文件对象)实例传递给stdout参数。观察新行的StringIO实例,当到达新行时,您可以yield
到StreamingHttpResponse(例如,参见this answer)。