Работает!!!
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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,9 +101,25 @@ 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']
|
||||||
@@ -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()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user