我创建了带有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")
答案 0 :(得分:0)
首先,您需要确保您的数据源(formations()
)实际上是一个在可用时生成数据的生成器。现在它看起来非常像运行命令,只有在完成后才返回一个值。
此外,如果您使用AJAX来呼叫您的终端,请记住您不能使用例如jQuery的$.ajax()
;您需要直接使用XHR并轮询新数据而不是使用onreadystatechange事件,因为您希望数据一旦可用,而不仅仅是在请求完成时。