0

リモートサーバーにあるシェルスクリプトを呼び出すためにファブリックを使用するフラスコを使用して、マイクロ Web フレームワークを作成しました。

シェル スクリプトが完了するまでに時間がかかる場合があります。ブラウザから 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()。リクエストが終了したときだけでなく、利用可能になったらデータが必要になるため、 onreadystatechange イベントを使用する代わりに、XHRを直接使用して新しいデータをポーリングする必要があります。

于 2013-09-25T12:41:23.557 に答える