Для відслідковування довгого процесу на сервері та надання користувачу можливості бачити прогрес виконання, ви можете використовувати техніку, яка використовує вебсокети або HTTP-запити для передачі інформації про стан процесу. Вам також знадобиться JavaScript на стороні клієнта для оновлення інформації про прогрес.
Ось загальний опис того, як це можна реалізувати за допомогою Flask і вебсокетів за допомогою бібліотеки Flask-SocketIO
:
1. Встановіть Flask-SocketIO
:
Встановіть бібліотеку Flask-SocketIO
, якщо ви ще цього не зробили:
pip install Flask-SocketIO
2. Створіть Flask додаток:
Створіть файл app.py
та ініціалізуйте додаток Flask:
from flask import Flask, render_template
from flask_socketio import SocketIO, emit
app = Flask(__name__)
socketio = SocketIO(app)
3. Створіть маршрути:
Створіть маршрут для відображення сторінки та маршрут для початку довгого процесу:
@app.route(`/`)
def index():
return render_template(`index.html`)
@app.route(`/start_long_process`)
def start_long_process():
# Початок довгого процесу
# Отримуйте інформацію про стан процесу і відправляйте її через вебсокети
for i in range(1, 101):
socketio.emit(`update`, {`progress`: i}, namespace=`/test`)
time.sleep(1)
return `Довгий процес завершено!`
4. Створіть сторінку HTML для користувача:
Створіть файл templates/index.html
:
Довгий процес
Довгий процес
5. Запустіть додаток:
Ваш додаток Flask можна запустити за допомогою socketio.run
:
if __name__ == `__main__`:
socketio.run(app, debug=True)
Цей приклад дозволить вам почати довгий процес та отримувати інформацію про прогрес у реальному часі на сторінці користувача завдяки вебсокетам.
Не забудьте налаштувати та налаштувати ваш додаток та вебсокети на продуктовому сервері перед використанням на публічних ресурсах.
Якщо у вас є довгий процес в Flask, і ви хочете передавати інформацію про його стан користувачеві, ви можете використовувати WebSocket або AJAX-запити для асинхронного оновлення сторінки. Давайте розглянемо приклад використання AJAX-запитів з бібліотекою Flask-SocketIO.
1. Встановлення Flask-SocketIO:
Встановіть бібліотеку Flask-SocketIO, якщо ви ще цього не зробили:
pip install flask-socketio
2. Створення Flask-додатка:
Створіть основний файл для вашого Flask-додатка. Ось простий приклад:
from flask import Flask, render_template
from flask_socketio import SocketIO, emit
import time
import threading
app = Flask(__name__)
socketio = SocketIO(app)
@app.route(’/’)
def index():
return render_template(’index.html’)
def long_running_task():
for i in range(10):
time.sleep(1)
# Оновлення статусу процесу за допомогою SocketIO
socketio.emit(’update_status’, {’status’: f’Step {i + 1} completed’})
@socketio.on(’start_task’)
def start_long_running_task():
# Запуск довгого процесу в окремому потоці
threading.Thread(target=long_running_task).start()
if __name__ == ’__main__’:
socketio.run(app, debug=True)
3. Створення шаблону HTML:
Створіть файл templates/index.html
для відображення сторінки та взаємодії зі статусом процесу:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Long Running Task</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js"></script>
<script>
var socket = io.connect(’http://’ + document.domain + ’:’ + location.port);
socket.on(’update_status’, function(data) {
document.getElementById(’status’).innerText = data.status;
});
</script>
</head>
<body>
<h1>Long Running Task</h1>
<button onclick="startTask()">Start Task</button>
<p id="status"></p>
<script>
function startTask() {
socket.emit(’start_task’);
}
</script>
</body>
</html>
4. Запуск додатка:
Запустіть ваш Flask-додаток та перейдіть за адресою http://127.0.0.1:5000/
у веб-браузері.
Цей приклад використовує Flask-SocketIO для забезпечення зв'язку між сервером і клієнтом через WebSocket. Коли ви натискаєте кнопку "Start Task", сервер запускає довгий процес в окремому потоці і регулярно висилає оновлення статусу за допомогою SocketIO, яке відображається на сторінці.
Не забудьте встановити Flask-SocketIO перед запуском цього коду.
Автор: Рудюк С.А. 2023. K2 Cloud ERP.