Python烧瓶实时返回值

时间:2013-09-25 10:50:12

标签: python flask fabric

我创建了带有flask的微型Web框架,它使用fabric来调用远程服务器中的shell脚本。

shell脚本可能需要更长的时间才能完成。我从浏览器发送POST请求,等待结果。

结构显示烧瓶运行屏幕上的实时内容,但烧瓶在完成远程脚本后将值返回给浏览器。

如何让我的烧瓶在我的浏览器屏幕上打印实时值?

我的烧瓶:

@app.route("/abc/execute", methods=['POST'])
def execute_me():
    value = request.json['value']
    result = fabric_call(value)
    result = formations(result)
    return json.dumps(result)

我的布料:

def fabric_call(value):
    with settings(host_string='my server', user='user',password='passwd',warn_only=True):
        proc = run(my shell script)
        return json.dumps(proc)

更新

我也试过了streamin`。但它没有用。脚本完成执行后,输出显示在我的curl POST中。我错过了什么?

@app.route("/abc/execute", methods=['POST'])
def execute_me():
    value = request.json['value']
    def generate():
        for row in formations(fabric_call(value)):
            yield row + '\n'
    return Response(generate(), mimetype="text/event-stream")

1 个答案:

答案 0 :(得分:0)

首先,您需要确保您的数据源(formations())实际上是一个在可用时生成数据的生成器。现在它看起来非常像运行命令,只有在完成后才返回一个值。

此外,如果您使用AJAX来呼叫您的终端,请记住您不能使用例如jQuery的$.ajax();您需要直接使用XHR并轮询新数据而不是使用onreadystatechange事件,因为您希望数据一旦可用,而不仅仅是在请求完成时。