"返回" stdout到浏览器而不退出Flask中的任何功能

时间:2017-05-05 20:09:03

标签: python flask stdout fabric

我正在混合使用Python Flask(用于触发进程)和Fabric(用于自动执行远程计算机上的任务)。

我尝试使用 yield 关键字并成功设法在Flask中显示示例程序的输出但没有Fabric。

#!/usr/bin/env python

from flask import Flask, render_template, redirect, url_for, Response
import pexpect
import sys

app = Flask(__name__)

@app.route('/getdata')
def getdata():
    def meh():
        child = pexpect.spawn('/bin/bash')
        child.sendline('mysh.sh')
        child.expect(pexpect.EOF)
        child.expect(' press [Enter]')
        child.interact()
        child.expect(pexpect.EOF)

        for line in iter(sys.stdout.readline,''):
            yield line.rstrip() + '\n'

    return Response(meh(), mimetype='text/html')


if __name__ == "__main__":
    app.run()

有人能指出我应该想要完成的方向吗?这样每个结构运行(命令)的标准输出都会在运行时显示给浏览器。

1 个答案:

答案 0 :(得分:1)

好吧,如果你的意思是'实时'而不仅仅是运行时间,你可能想做的就是在你的框架上看一点,如果你想要实时返回数据(就像在构建工具中一样)等)。

为此,您可以将结构作为单独的异步任务运行(使用像celery等一些框架),并将结果从结构转储回队列/管道/数据库/等等。然后让原始线程从重复请求或重复队列返回。

然而,只需从您的数据,结构(或者如果您真的想要)调用结构,可以从您的代码中调用Paramiko(它是结构所包含的库)),即不使用shell来调用{{ 1}}。

当调用run()时,你可以检索正在运行的命令的std out / std err的输出...... Paramiko的文档记录不太清楚(这就是为什么使用Fabric非常棒),但如果你看看这个博客: http://jessenoller.com/blog/2009/02/05/ssh-programming-with-paramiko-completely-different这包含大量信息:

基本上,那里的例子是:

fab foo

x的值 - > ['13:35上11天,3:13,4位用户,平均负载:0.14 0.18 0.16 \ n']

添加到烧瓶中这将是微不足道的,但它不会实时,即烧瓶和服务器将缓冲它,并在过程结束时将整批产品返回到浏览器,假设浏览器没有超时。

希望有所帮助。