0

我用烧瓶创建了我的微型 Web 框架,它使用结构来调用远程服务器中的 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)

更新

我也尝试过流式传输。但它没有用。脚本完成执行后,输出将显示在我的 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")
4

1 回答 1

0

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

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

于 2013-09-25T12:41:23.557 回答