Работает!!!

This commit is contained in:
2025-09-04 22:53:01 +03:00
parent 36f37ffacb
commit 1bfe3c0cd8
2 changed files with 64 additions and 23 deletions

View File

@@ -5,43 +5,57 @@ import streamlit as st
import asyncio import asyncio
import threading import threading
import time import time
import json
import os
from api_client import upload_file_to_api from api_client import upload_file_to_api
from config import PARSER_TABS from config import PARSER_TABS
# Глобальное хранилище задач (в реальном приложении лучше использовать Redis или БД)
TASKS_STORAGE = {}
def upload_file_async_background(endpoint, file_data, filename, task_id): def upload_file_async_background(endpoint, file_data, filename, task_id):
"""Асинхронная загрузка файла в фоновом режиме""" """Асинхронная загрузка файла в фоновом режиме"""
global TASKS_STORAGE
try: try:
# Обновляем статус на "running"
TASKS_STORAGE[task_id] = {
'status': 'running',
'filename': filename,
'endpoint': endpoint,
'started_at': time.time(),
'progress': 0
}
# Имитируем асинхронную работу # Имитируем асинхронную работу
time.sleep(1) # Небольшая задержка для демонстрации time.sleep(1) # Небольшая задержка для демонстрации
# Выполняем загрузку # Выполняем загрузку
result, status = upload_file_to_api(endpoint, file_data, filename) result, status = upload_file_to_api(endpoint, file_data, filename)
# Сохраняем результат в session_state # Сохраняем результат в глобальном хранилище
if 'upload_tasks' not in st.session_state: TASKS_STORAGE[task_id] = {
st.session_state.upload_tasks = {}
st.session_state.upload_tasks[task_id] = {
'status': 'completed' if status == 200 else 'failed', 'status': 'completed' if status == 200 else 'failed',
'result': result, 'result': result,
'status_code': status, 'status_code': status,
'filename': filename, 'filename': filename,
'endpoint': endpoint, 'endpoint': endpoint,
'completed_at': time.time() 'started_at': TASKS_STORAGE.get(task_id, {}).get('started_at', time.time()),
'completed_at': time.time(),
'progress': 100
} }
except Exception as e: except Exception as e:
# Сохраняем ошибку # Сохраняем ошибку
if 'upload_tasks' not in st.session_state: TASKS_STORAGE[task_id] = {
st.session_state.upload_tasks = {}
st.session_state.upload_tasks[task_id] = {
'status': 'failed', 'status': 'failed',
'error': str(e), 'error': str(e),
'filename': filename, 'filename': filename,
'endpoint': endpoint, 'endpoint': endpoint,
'completed_at': time.time() 'started_at': TASKS_STORAGE.get(task_id, {}).get('started_at', time.time()),
'completed_at': time.time(),
'progress': 0
} }

View File

@@ -4,6 +4,7 @@
import streamlit as st import streamlit as st
from datetime import datetime from datetime import datetime
import time import time
from async_upload_page import TASKS_STORAGE
def render_tasks_page(): def render_tasks_page():
@@ -20,7 +21,17 @@ def render_tasks_page():
with col2: with col2:
if st.button("🗑️ Очистить завершенные", key="clear_completed_btn", use_container_width=True): if st.button("🗑️ Очистить завершенные", key="clear_completed_btn", use_container_width=True):
st.info("Функция очистки будет добавлена в следующих версиях") # Удаляем завершенные и неудачные задачи
tasks_to_remove = []
for task_id, task in TASKS_STORAGE.items():
if task.get('status') in ['completed', 'failed']:
tasks_to_remove.append(task_id)
for task_id in tasks_to_remove:
del TASKS_STORAGE[task_id]
st.success(f"✅ Удалено {len(tasks_to_remove)} завершенных задач")
st.rerun()
with col3: with col3:
auto_refresh = st.checkbox("🔄 Автообновление", key="auto_refresh_checkbox") auto_refresh = st.checkbox("🔄 Автообновление", key="auto_refresh_checkbox")
@@ -36,8 +47,8 @@ def render_tasks_page():
# Статистика задач # Статистика задач
st.subheader("📊 Статистика задач") st.subheader("📊 Статистика задач")
# Получаем задачи из session_state # Получаем задачи из глобального хранилища
tasks = st.session_state.get('upload_tasks', {}) tasks = TASKS_STORAGE
# Подсчитываем статистику # Подсчитываем статистику
total_tasks = len(tasks) total_tasks = len(tasks)
@@ -68,8 +79,8 @@ def render_tasks_page():
# Список задач # Список задач
st.subheader("📋 Список задач") st.subheader("📋 Список задач")
# Получаем задачи из session_state # Получаем задачи из глобального хранилища
tasks = st.session_state.get('upload_tasks', {}) tasks = TASKS_STORAGE
if tasks: if tasks:
# Показываем задачи # Показываем задачи
@@ -90,10 +101,26 @@ def render_tasks_page():
st.write(f"**Файл:** {task.get('filename', 'Unknown')}") st.write(f"**Файл:** {task.get('filename', 'Unknown')}")
st.write(f"**Эндпоинт:** {task.get('endpoint', 'Unknown')}") st.write(f"**Эндпоинт:** {task.get('endpoint', 'Unknown')}")
# Показываем прогресс для выполняющихся задач
if task.get('status') == 'running':
progress = task.get('progress', 0)
st.write(f"**Прогресс:** {progress}%")
st.progress(progress / 100)
# Показываем время выполнения
if task.get('started_at'):
started_time = datetime.fromtimestamp(task['started_at']).strftime("%Y-%m-%d %H:%M:%S")
st.write(f"**Начата:** {started_time}")
if task.get('completed_at'): if task.get('completed_at'):
completed_time = datetime.fromtimestamp(task['completed_at']).strftime("%Y-%m-%d %H:%M:%S") completed_time = datetime.fromtimestamp(task['completed_at']).strftime("%Y-%m-%d %H:%M:%S")
st.write(f"**Завершена:** {completed_time}") st.write(f"**Завершена:** {completed_time}")
# Показываем длительность
if task.get('started_at'):
duration = task['completed_at'] - task['started_at']
st.write(f"**Длительность:** {duration:.1f} сек")
if task.get('result'): if task.get('result'):
result = task['result'] result = task['result']
if task.get('status') == 'completed': if task.get('status') == 'completed':
@@ -112,9 +139,9 @@ def render_tasks_page():
st.info("Функция отмены будет реализована в следующих версиях") st.info("Функция отмены будет реализована в следующих версиях")
else: else:
if st.button("🗑️ Удалить", key=f"delete_{task_id}_btn", use_container_width=True): if st.button("🗑️ Удалить", key=f"delete_{task_id}_btn", use_container_width=True):
# Удаляем задачу из session_state # Удаляем задачу из глобального хранилища
if 'upload_tasks' in st.session_state: if task_id in TASKS_STORAGE:
del st.session_state.upload_tasks[task_id] del TASKS_STORAGE[task_id]
st.rerun() st.rerun()
else: else:
# Пустое состояние # Пустое состояние
@@ -128,15 +155,15 @@ def render_tasks_page():
# Кнопка для создания тестовой задачи # Кнопка для создания тестовой задачи
if st.button("🧪 Создать тестовую задачу", key="create_test_task_btn"): if st.button("🧪 Создать тестовую задачу", key="create_test_task_btn"):
test_task_id = f"test_task_{int(time.time())}" test_task_id = f"test_task_{int(time.time())}"
if 'upload_tasks' not in st.session_state:
st.session_state.upload_tasks = {}
st.session_state.upload_tasks[test_task_id] = { TASKS_STORAGE[test_task_id] = {
'status': 'completed', 'status': 'completed',
'filename': 'test_file.zip', 'filename': 'test_file.zip',
'endpoint': '/test/upload', 'endpoint': '/test/upload',
'result': {'message': 'Тестовая задача выполнена', 'object_id': 'test-123'}, 'result': {'message': 'Тестовая задача выполнена', 'object_id': 'test-123'},
'completed_at': time.time() 'started_at': time.time() - 5, # 5 секунд назад
'completed_at': time.time(),
'progress': 100
} }
st.rerun() st.rerun()