Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -16,16 +16,17 @@ DB_FILENAME = "auth_system.db"
|
|
| 16 |
HF_TOKEN_WRITE = os.getenv("HF_TOKEN") # Токен для записи (загрузки)
|
| 17 |
HF_TOKEN_READ = os.getenv("HF_TOKEN_READ") # Токен для чтения (скачивания)
|
| 18 |
|
| 19 |
-
# Глобальные переменные для подключения к базе
|
| 20 |
conn = None
|
| 21 |
c = None
|
| 22 |
|
| 23 |
def init_db_connection():
|
| 24 |
-
"""Открывает новое соединение с базой данных
|
| 25 |
global conn, c
|
| 26 |
if conn is not None:
|
| 27 |
conn.close()
|
| 28 |
-
|
|
|
|
| 29 |
c = conn.cursor()
|
| 30 |
|
| 31 |
# --- Создание таблиц, если они не существуют ---
|
|
@@ -112,10 +113,13 @@ def upload_db_to_hf():
|
|
| 112 |
|
| 113 |
# --- Функция периодического резервного копирования ---
|
| 114 |
def periodic_backup():
|
| 115 |
-
"""
|
|
|
|
|
|
|
|
|
|
| 116 |
while True:
|
| 117 |
upload_db_to_hf()
|
| 118 |
-
time.sleep(1800)
|
| 119 |
|
| 120 |
# --- Вспомогательные функции ---
|
| 121 |
def generate_token():
|
|
@@ -398,7 +402,6 @@ def main():
|
|
| 398 |
download_success = download_db_from_hf()
|
| 399 |
if download_success:
|
| 400 |
st.success("База данных успешно скачана из Hugging Face!")
|
| 401 |
-
# Изменяем права доступа, чтобы база стала доступна для записи
|
| 402 |
try:
|
| 403 |
os.chmod(DB_FILENAME, 0o666)
|
| 404 |
st.info("Права доступа к базе данных изменены (read-write).")
|
|
@@ -414,7 +417,7 @@ def main():
|
|
| 414 |
# Переинициализируем соединение с базой данных после изменения прав доступа
|
| 415 |
init_db_connection()
|
| 416 |
|
| 417 |
-
# Проверка
|
| 418 |
try:
|
| 419 |
c.execute("SELECT * FROM users LIMIT 1")
|
| 420 |
except sqlite3.OperationalError as e:
|
|
@@ -436,7 +439,6 @@ def main():
|
|
| 436 |
if st.session_state.logged_in:
|
| 437 |
st.sidebar.title(f"Привет, {st.session_state.username}!")
|
| 438 |
option = st.sidebar.selectbox("Выберите действие", ["Добавить товар", "Отпуск товара", "Редактировать товары", "Отчет за месяц", "Выйти"])
|
| 439 |
-
|
| 440 |
if option == "Добавить товар":
|
| 441 |
add_product()
|
| 442 |
elif option == "Отпуск товара":
|
|
@@ -459,8 +461,7 @@ def main():
|
|
| 459 |
|
| 460 |
if __name__ == "__main__":
|
| 461 |
main()
|
| 462 |
-
# Ждем 15 секунд после
|
| 463 |
time.sleep(15)
|
| 464 |
-
# Запускаем фоновый поток резервного копирования
|
| 465 |
backup_thread = threading.Thread(target=periodic_backup, daemon=True)
|
| 466 |
backup_thread.start()
|
|
|
|
| 16 |
HF_TOKEN_WRITE = os.getenv("HF_TOKEN") # Токен для записи (загрузки)
|
| 17 |
HF_TOKEN_READ = os.getenv("HF_TOKEN_READ") # Токен для чтения (скачивания)
|
| 18 |
|
| 19 |
+
# Глобальные переменные для подключения к базе данных
|
| 20 |
conn = None
|
| 21 |
c = None
|
| 22 |
|
| 23 |
def init_db_connection():
|
| 24 |
+
"""Открывает новое соединение с базой данных с увеличенным таймаутом."""
|
| 25 |
global conn, c
|
| 26 |
if conn is not None:
|
| 27 |
conn.close()
|
| 28 |
+
# Устанавливаем timeout=30 секунд, чтобы операции ожидали освобождения блокировки
|
| 29 |
+
conn = sqlite3.connect(DB_FILENAME, check_same_thread=False, timeout=30)
|
| 30 |
c = conn.cursor()
|
| 31 |
|
| 32 |
# --- Создание таблиц, если они не существуют ---
|
|
|
|
| 113 |
|
| 114 |
# --- Функция периодического резервного копирования ---
|
| 115 |
def periodic_backup():
|
| 116 |
+
"""
|
| 117 |
+
Запускает бесконечный цикл резервного копирования с интервалом в 30 минут.
|
| 118 |
+
Здесь не используются глобальные подключения, поскольку функция только читает файл.
|
| 119 |
+
"""
|
| 120 |
while True:
|
| 121 |
upload_db_to_hf()
|
| 122 |
+
time.sleep(1800) # 30 минут = 1800 секунд
|
| 123 |
|
| 124 |
# --- Вспомогательные функции ---
|
| 125 |
def generate_token():
|
|
|
|
| 402 |
download_success = download_db_from_hf()
|
| 403 |
if download_success:
|
| 404 |
st.success("База данных успешно скачана из Hugging Face!")
|
|
|
|
| 405 |
try:
|
| 406 |
os.chmod(DB_FILENAME, 0o666)
|
| 407 |
st.info("Права доступа к базе данных изменены (read-write).")
|
|
|
|
| 417 |
# Переинициализируем соединение с базой данных после изменения прав доступа
|
| 418 |
init_db_connection()
|
| 419 |
|
| 420 |
+
# Проверка наличия таблицы "users". Если отсутствует, создаём таблицы.
|
| 421 |
try:
|
| 422 |
c.execute("SELECT * FROM users LIMIT 1")
|
| 423 |
except sqlite3.OperationalError as e:
|
|
|
|
| 439 |
if st.session_state.logged_in:
|
| 440 |
st.sidebar.title(f"Привет, {st.session_state.username}!")
|
| 441 |
option = st.sidebar.selectbox("Выберите действие", ["Добавить товар", "Отпуск товара", "Редактировать товары", "Отчет за месяц", "Выйти"])
|
|
|
|
| 442 |
if option == "Добавить товар":
|
| 443 |
add_product()
|
| 444 |
elif option == "Отпуск товара":
|
|
|
|
| 461 |
|
| 462 |
if __name__ == "__main__":
|
| 463 |
main()
|
| 464 |
+
# Ждем 15 секунд после инициализации базы данных, затем запускаем фоновый поток резервного копирования
|
| 465 |
time.sleep(15)
|
|
|
|
| 466 |
backup_thread = threading.Thread(target=periodic_backup, daemon=True)
|
| 467 |
backup_thread.start()
|