Я создаю свое самое первое веб-приложение. Я использую flask и MySQL для этого проекта.
Цель приложения - позволить пользователю войти в систему, и только с несколькими параметрами получить список воспроизведения, сгенерированный внутренним кодом, и MySQL запросов к моей базе данных.
Список воспроизведения создается для каждого конкретного c пользователь использует некоторые данные, которые он предоставляет при регистрации.
Теперь предположим, что пользователь запрашивает список воспроизведения, запрос получен, и вычисление может занять некоторое время,
, хотя другие SQL запросы, сделанные пользователем, могут быть очень короткими. (например, просмотреть мои сохраненные списки воспроизведения)
Я пытаюсь выяснить, как объединить flask и многопоточность, чтобы все запросы выполнялись в отдельном потоке (это необходимо), и их ответ мог бы быть возвращается пользователю, но пока пользователь ожидает, пользовательский интерфейс представит анимацию загрузки.
Пример кода;
#This is the home page where the user enters some data required for playlist creation
# he than can click a button which performs a get request to the function below to present the playlist
@app.route('/home/', methods=['GET'])
def home():
return render_template('home.html')
# User sends a request for a playlist
@app.route('/playlist_create/', methods=['GET', 'POST'])
@login_required
def playlist_create():
# User clicked the save button
if request.method == 'POST':
#... save playlist to data base
# Get args
ptype = request.args.get('type')
mood = request.args.get('mood')
user = session['userdata']
#playlist object on another folder
playlist = Playlist(ptype, mood,user)
# -----Some sql queries to server that takes some time (but might be very short)------
playlist.generate_from_db()
return render_template('playlists.html', playlist=playlist)
Итак, чего я пытаюсь достичь является то, что функция
playlist.generate_from_db()
будет выполняться в другом потоке (например, в пуле потоков), и я верну отображаемую страницу загрузки пользователю.
Пока создается список воспроизведения, анимация загрузки будет отображаться пользователю, и когда она будет, наконец, сгенерирована и завершена, анимация загрузки исчезнет, и render_template('result.html',playlst=playlist)
, сгенерированный из этих данных, будет каким-то образом вставлен в ту же самую страница, или, возможно, перенаправить запрос на страницу, которая показывает результат.
Как я могу сообщить пользователю, что запрос выполнен, и отобразить данные?
Что я пробовал
Я нашел несколько решений для пакетных заданий, которые ничего не возвращали из потока создал - это не так.
В моем поиске я наткнулся, например, на библиотеку socketio, чтобы решить эту проблему, дело в том, что некоторые многопоточные запросы очень короткие, поэтому, когда я генерирую событие 'job_finished', скажем, страница еще не загружена, и анимация загрузки остается навсегда.
Мысль о цикле при условии, что поток не выполняется через созданный мною контейнер,
, но jinja не позволяет использовать некоторое время Я oop, и это напрасная занятость ожидания.
Еще одним решением, которое я нашел, может быть Celery, который, по моему мнению, требует какого-то брокера для хранения вычислений. это похоже на излишество для этого проекта.
Есть ли простой способ сделать это с python и flask?
Я очень новичок в веб-программировании, поэтому я пытаюсь выяснить, как правильно это делать и что использовать.
Буду признателен за любую помощь, спасибо!