2013-09-25 2 views
0

Я создал свою микро-веб-фреймворк с флягой, которая использует ткань для вызова сценариев оболочки, которые находятся на удаленных серверах.Колба Python, возвращающая значения в реальном времени

Скрипт оболочки может занять больше времени, чтобы завершить работу. Я отправляю запрос 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) 

Update

Я попытался 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

Прежде всего, JSON и в реальном времени не смешиваются. Если вы вернете JSON, вы можете вернуть только объект целиком. Конечно, вы можете возвращать несколько объектов JSON (например, по одному на строку). Чтобы сделать что-то подобное в фляге, вам нужно вернуть ответ, обертывающий генератор, который дает данные, когда он готов к отправке: http://flask.pocoo.org/docs/patterns/streaming/ – ThiefMaster

+0

@ThiefMaster: именно это что я пробовал сейчас. Посмотрите мое обновление – Sathy

ответ

0

Прежде всего, вам необходимо убедиться, что источник данных (formations()) на самом деле является генератор, который дает данные, если они доступны. Сейчас он очень похож, что он запускает команду и возвращает значение только после того, как он полностью закончил.

Также, если вы используете AJAX для вызова своей конечной точки, помните, что вы не можете использовать, например. jQuery's $.ajax(); вам нужно напрямую использовать XHR и опросить новые данные вместо использования события onreadystatechange, поскольку вам нужны данные, когда они доступны, и не только после завершения запроса.

Смежные вопросы