В общем что я хочу сделать — есть функция, которая работает медленно (парсит некоторые данные в интернете и отдаёт их постепенно, допустим с yield). Я хочу, чтобы пользователь не ждал всех результатов и потом увидел всю страницу целиком, а получал эти данные по мере поступления. Выбор пал на flask_socketio
. Для примера я создал простейшее приложение. Оно отдаёт изначально готовый шаблон и этот шаблон я хочу наполнить новыми элементами. Код:
from flask import Flask, render_template
from flask_socketio import SocketIO
from time import sleep
app = Flask(__name__)
socketio = SocketIO(app)
@app.route('/')
def index():
return render_template('index.html')
@socketio.on('connect')
def test_connect():
for i in range(5):
html = render_template('div.html', number=i)
socketio.emit('update', {'tag': html})
sleep(1)
if __name__ == '__main__':
socketio.run(app, host='0.0.0.0', debug=True)
var insertElement = function(html){
var el = document.createElement('div');
el.innerHTML = html;
return el.childNodes[0];
}
$(document).ready(function(){
var socket = io.connect('http://' + document.domain + ':' + location.port);
socket.on('update', function(response){
insertElement(response.tag);
console.log('data: ' + response.tag);
});
});
jquery — 3.1.1, socket.io — 1.7.2.
Собственно, что происходит: при загрузке страницы в консоли js я вижу очень долгий первый запрос, потом быстро несколько запросов и вывод в консоль в одну секунду всех результатов. Почему так происходит — я понять не могу, равно как и почему элементы, которые я создаю не появляются в DOM. Вот скрин происходящего click!.
Заранее благодарю за ответы/советы.
P.S. если я выбрал не тот подход, вполне соглашусь на подобный. Главное, чтобы при загрузке страницы не тупило, пока подготовятся все данные.