«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как динамически обновлять и отображать данные, передаваемые из представления Flask?

Как динамически обновлять и отображать данные, передаваемые из представления Flask?

Опубликовано 23 декабря 2024 г.
Просматривать:521

How to Dynamically Update and Display Data Streamed from a Flask View?

Отображение данных, передаваемых в потоковом режиме из представления Flask, по мере их обновления

Введение

В приложениях Flask часто желательно отображать данные, которые генерируются или обновляются в режиме реального времени. Хотя Flask имеет встроенную поддержку потоковой передачи ответов, включение этих данных в шаблон HTML может оказаться сложной задачей. В этой статье рассказывается, как динамически обновлять, форматировать и отображать данные при их потоковой передаче на страницу.

Потоковая передача данных в Flask

Для потоковой передачи данных в Flask, вы может использовать генератор в качестве ответа на маршрут. Каждый раз, когда ответ повторяется, генератор передает клиенту фрагмент данных. Например:

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

Этот код имитирует длительный процесс, генерирующий значения каждую секунду. Эти значения затем передаются в ответ в виде фрагментов HTML.

Обработка потоковых данных в JavaScript

Хотя Flask поддерживает потоковую передачу ответов, HTML-шаблоны обрабатываются один раз на стороне сервера. и не может быть динамически обновлено. Чтобы обрабатывать потоковые данные в браузере, вы можете использовать JavaScript для отправки запроса к конечной точке и обработки потоковых данных по мере их поступления.

Один из подходов — использовать объект XMLHttpRequest (XHR) для создания запроса к конечная точка потоковой передачи. Затем вы можете периодически считывать данные из ответа, пока он не будет завершен. Вот пример:

var xhr = new XMLHttpRequest();
xhr.open('GET', '{{ url_for('stream') }}');
xhr.send();
var position = 0;

function handleNewData() {
    // the response text includes 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) {
        // Update the displayed data using JavaScript
        latest.textContent = value;  // update the latest value in place
        // Append the current value to a list to log all output
        var item = document.createElement('li');
        item.textContent = value;
        output.appendChild(item);
    });
    position = messages.length - 1;
}

// Check for new data periodically
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);

Этот код JavaScript использует объект XMLHttpRequest для создания запроса к конечной точке потоковой передачи. Затем он устанавливает таймер для периодической проверки новых данных и соответствующего обновления страницы.

Использование iframe для потокового вывода HTML

Другой подход к отображению потоковых данных из Представление Flask должно использовать iframe. iframe — это отдельный документ, который можно использовать для отображения потокового вывода HTML. Вот пример:

@app.route('/stream')
def stream():
    @stream_with_context
    def generate():
        # Serve initial CSS to style the iframe
        yield render_template_string('')

        # Continuously stream HTML content within the iframe
        for i in range(500):
            yield render_template_string('

{{ i }}: {{ s }}

\n', i=i, s=sqrt(i)) sleep(1) return app.response_class(generate())

This is all the output:

Этот код использует декораторstream_with_context для улучшения генератора для поддержки дополнительных функций. Он использует исходный CSS для стилизации iframe и непрерывно передает HTML-контент внутри iframe. HTML-шаблон в iframe может быть более сложным и при необходимости включать различное форматирование.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3