Отображать данные, передаваемые из флага, при обновлении

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

import flask import time, math app = flask.Flask(__name__) @app.route('/') def index(): def inner(): # simulate a long process to watch for i in range(500): j = math.sqrt(i) time.sleep(1) # this value should be inserted into an HTML template yield str(i) + '<br/>\n' return flask.Response(inner(), mimetype='text/html') app.run(debug=True) 

  • Django, Turbo Gears, Web2Py, что лучше для чего?
  • Сделать distutils искать файлы заголовков numpy в правильном месте
  • html parser python
  • Как добавить заголовки http в пеной 0.3.6?
  • Проверка документа yaml в python
  • Для чего __init__.py?
  • Одна вторичная метка отсутствует при построении дополнительной оси x и y
  • Как добавить изображение в QWidget в PyQt4
  • One Solution collect form web for “Отображать данные, передаваемые из флага, при обновлении”

    Вы можете передавать данные в ответ, но вы не можете динамически обновлять шаблон так, как вы описываете. Шаблон создается один раз на стороне сервера, а затем отправляется клиенту. Вам нужно будет использовать JavaScript для чтения потокового ответа и вывода данных на стороне клиента.

    Используйте XMLHttpRequest чтобы сделать запрос к конечной точке, которая будет передавать данные. Затем периодически читайте поток, пока он не будет выполнен.

    Этот пример предполагает очень простой формат сообщения: одну строку данных, а затем новую строку. Конечно, вы можете так же усложниться в разборе, сколько хотите, пока есть способ идентифицировать каждое сообщение. Например, вы можете вернуть объект JSON и декодировать его на клиенте.

     from time import sleep from flask import Flask, render_template from math import sqrt app = Flask(__name__) @app.route('/') def index(): # render the template (below) that will use JavaScript to read the stream return render_template('index.html') @app.route('/stream_sqrt') def stream(): def generate(): for i in range(500): yield '{}\n'.format(sqrt(i)) sleep(1) return app.response_class(generate(), mimetype='text/plain') app.run() 
     <p>This is the latest output: <span id="latest"></span></p> <p>This is all the output:</p> <ul id="output"></ul> <script> var latest = document.getElementById('latest'); var output = document.getElementById('output'); var xhr = new XMLHttpRequest(); xhr.open('GET', '{{ url_for('stream') }}'); xhr.send(); var position = 0; function handleNewData() { // the response text include the entire response so far // split the messages, then take the messages that haven't been handled yet // position tracks how many messages have been handled // messages end with a newline, so split will always show one extra empty message at the end var messages = xhr.responseText.split('\n'); messages.slice(position, -1).forEach(function(value) { latest.textContent = value; // update the latest value in place // build and append a new item to a list to log all output var item = document.createElement('li'); item.textContent = value; output.appendChild(item); }); position = messages.length - 1; } var timer; timer = setInterval(function() { // check the response for new data handleNewData(); // stop checking once the response has ended if (xhr.readyState == XMLHttpRequest.DONE) { clearInterval(timer); latest.textContent = 'Done'; } }, 1000); </script> 
    Python - лучший язык программирования в мире.