From 8772eaaf3d938ab50f5d4ec3bb5f6266737a0636 Mon Sep 17 00:00:00 2001 From: gitadmin Date: Sun, 21 Dec 2025 13:03:16 +0300 Subject: [PATCH] =?UTF-8?q?[=D0=92=D0=9E=D0=9B=D0=9A]=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B5=D0=BD=D1=82=D0=B5=D1=80=D0=B0=D0=B1=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D0=BB=D0=BE=D0=B3?= =?UTF-8?q?=D0=B3=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- volk_load.py | 106 +++++++++++++++------------------------------------ 1 file changed, 31 insertions(+), 75 deletions(-) diff --git a/volk_load.py b/volk_load.py index 8a5f380..ff0486c 100644 --- a/volk_load.py +++ b/volk_load.py @@ -1,6 +1,7 @@ import os import json import time +import traceback from datetime import datetime from urllib.request import urlopen from dotenv import load_dotenv @@ -36,8 +37,8 @@ def log_message(message, category="VOLK_loader"): if attempt < 4: # Не последняя попытка time.sleep(0.4) # Задержка 400ms между попытками else: - # После 5 неудачных попыток выводим в stdout - print(f"Не удалось записать в лог после 5 попыток: {log_entry.strip()}") + # После 5 неудачных попыток просто возвращаем False + # Не используем print() чтобы избежать реентерабельных вызовов с gunicorn return False return False @@ -52,9 +53,7 @@ def load_categories(): # Проверка наличия URL if not VOLK_CATEGORY_LIST: error_msg = "Переменная окружения VOLK_CATEGORY_LIST не установлена" -# log_message(error_msg, "ERROR") - log_message(error_msg) - print(error_msg) + log_message(error_msg, "ERROR") return # Чтение JSON из URL @@ -66,9 +65,7 @@ def load_categories(): api_version = data.get('api_version') if api_version != VOLK_API_VERSION: error_msg = f"Несовпадение версии API: получена версия '{api_version}', ожидается '{VOLK_API_VERSION}'. Обработка остановлена." -# log_message(error_msg, "ERROR") - log_message(error_msg) - print(error_msg) + log_message(error_msg, "ERROR") return log_message(f"Версия API соответствует: {api_version}") @@ -76,9 +73,7 @@ def load_categories(): # Проверка наличия блока data if 'data' not in data: error_msg = "В JSON отсутствует блок 'data'" -# log_message(error_msg, "ERROR") - log_message(error_msg) - print(error_msg) + log_message(error_msg, "ERROR") return categories_data = data['data'] @@ -109,8 +104,7 @@ def load_categories(): for item in categories_data: # Проверка обязательного поля ID if 'id' not in item or not item['id']: -# log_message(f"Пропущена запись без id или с пустым id: {item}", "WARNING") - log_message(f"Пропущена запись без id или с пустым id: {item}") + log_message(f"Пропущена запись без id или с пустым id: {item}", "WARNING") continue # Подготовка значений @@ -160,17 +154,17 @@ def load_categories(): desc_url = VOLK_CATEGORY_DESC_PREFIX + category_id log_message(f"Запрос описания для категории {category_id} из {desc_url}") log_message("отладочное сообщение для проверки вывода в лог-файл") + with urlopen(desc_url) as response: # Явно указываем кодировку UTF-8 при декодировании raw_data = response.read() log_message("raw data read") - try: + try: decoded_data = raw_data.decode('utf-8') log_message("data decoded") except UnicodeDecodeError as e: error_msg = f"Ошибка декодирования ответа для категории {category_id}: {e}. Попытка декодирования как latin-1." -# log_message(error_msg, "WARNING") - log_message(error_msg) + log_message(error_msg, "WARNING") decoded_data = raw_data.decode('latin-1') try: @@ -178,9 +172,7 @@ def load_categories(): log_message("json loaded") except json.JSONDecodeError as e: error_msg = f"Ошибка парсинга JSON для категории {category_id}: {e}. Первые 500 символов ответа: {decoded_data[:500]}" -# log_message(error_msg, "ERROR") - log_message(error_msg) - print(error_msg) + log_message(error_msg, "ERROR") # Пропускаем эту категорию и продолжаем обработку continue @@ -188,18 +180,14 @@ def load_categories(): api_version = desc_response.get('api_version') if api_version != VOLK_API_VERSION: error_msg = f"Несовпадение версии API при загрузке описания категории {category_id}: получена версия '{api_version}', ожидается '{VOLK_API_VERSION}'. Пропуск категории." -# log_message(error_msg, "ERROR") - log_message(error_msg) - print(error_msg) + log_message(error_msg, "ERROR") # Пропускаем эту категорию и продолжаем обработку continue # Проверка наличия блока data if 'data' not in desc_response: error_msg = f"В JSON ответе для категории {category_id} отсутствует блок 'data'. Пропуск категории." -# log_message(error_msg, "ERROR") - log_message(error_msg) - print(error_msg) + log_message(error_msg, "ERROR") # Пропускаем эту категорию и продолжаем обработку continue @@ -208,9 +196,7 @@ def load_categories(): # Проверка типа desc_data - должен быть словарём if not isinstance(desc_data, dict): error_msg = f"Блок 'data' для категории {category_id} не является словарём (тип: {type(desc_data)}). Пропуск категории." -# log_message(error_msg, "ERROR") - log_message(error_msg) - print(error_msg) + log_message(error_msg, "ERROR") # Пропускаем эту категорию и продолжаем обработку continue @@ -235,13 +221,9 @@ def load_categories(): except Exception as e: error_msg = f"Ошибка при загрузке описания для категории {category_id}: {type(e).__name__}: {e}" -# log_message(error_msg, "ERROR") - log_message(error_msg) - print(error_msg) - import traceback + log_message(error_msg, "ERROR") traceback_str = traceback.format_exc() -# log_message(f"Трассировка ошибки для категории {category_id}:\n{traceback_str}", "ERROR") - log_message(f"Трассировка ошибки для категории {category_id}:\n{traceback_str}") + log_message(f"Трассировка ошибки для категории {category_id}:\n{traceback_str}", "ERROR") # Пропускаем эту категорию и продолжаем обработку остальных continue @@ -251,16 +233,12 @@ def load_categories(): except Error as e: error_msg = f"Ошибка базы данных: {e}" -# log_message(error_msg, "ERROR") - log_message(error_msg) - print(error_msg) + log_message(error_msg, "ERROR") if 'connection' in locals() and connection.is_connected(): connection.rollback() except Exception as e: error_msg = f"Общая ошибка: {e}" -# log_message(error_msg, "ERROR") - log_message(error_msg) - print(error_msg) + log_message(error_msg, "ERROR") finally: if 'connection' in locals() and connection.is_connected(): cursor.close() @@ -277,17 +255,13 @@ def load_events_by_category(category_id): # Проверка наличия URL префикса if not VOLK_EVENT_LIST_PREFIX: error_msg = "Переменная окружения VOLK_EVENT_LIST_PREFIX не установлена" -# log_message(error_msg, "ERROR") - log_message(error_msg) - print(error_msg) + log_message(error_msg, "ERROR") return # Проверка наличия category_id if not category_id: error_msg = "ID категории не указан" -# log_message(error_msg, "ERROR") - log_message(error_msg) - print(error_msg) + log_message(error_msg, "ERROR") return # Формирование URL для запроса @@ -302,9 +276,7 @@ def load_events_by_category(category_id): api_version = data.get('api_version') if api_version != VOLK_API_VERSION: error_msg = f"Несовпадение версии API: получена версия '{api_version}', ожидается '{VOLK_API_VERSION}'. Обработка остановлена." -# log_message(error_msg, "ERROR") - log_message(error_msg) - print(error_msg) + log_message(error_msg, "ERROR") return log_message(f"Версия API соответствует: {api_version}") @@ -312,9 +284,7 @@ def load_events_by_category(category_id): # Проверка наличия блока data if 'data' not in data: error_msg = "В JSON отсутствует блок 'data'" -# log_message(error_msg, "ERROR") - log_message(error_msg) - print(error_msg) + log_message(error_msg, "ERROR") return events_data = data['data'] @@ -352,14 +322,12 @@ def load_events_by_category(category_id): for item in events_data: # Проверка обязательного поля id if 'id' not in item or item['id'] is None: -# log_message(f"Пропущено событие без id: {item}", "WARNING") - log_message(f"Пропущено событие без id: {item}") + log_message(f"Пропущено событие без id: {item}", "WARNING") continue # Проверка обязательного поля title if 'title' not in item or not item['title']: -# log_message(f"Пропущено событие без title (id: {item.get('id', 'N/A')}): {item}", "WARNING") - log_message(f"Пропущено событие без title (id: {item.get('id', 'N/A')}): {item}") + log_message(f"Пропущено событие без title (id: {item.get('id', 'N/A')}): {item}", "WARNING") continue # Подготовка значений с маппингом полей @@ -367,8 +335,7 @@ def load_events_by_category(category_id): try: id_event = int(item['id']) # Уникальный идентификатор события из JSON except (ValueError, TypeError): -# log_message(f"Пропущено событие с некорректным id (не число): {item.get('id', 'N/A')}", "WARNING") - log_message(f"Пропущено событие с некорректным id (не число): {item.get('id', 'N/A')}") + log_message(f"Пропущено событие с некорректным id (не число): {item.get('id', 'N/A')}", "WARNING") continue name = item.get('title', '') about = item.get('announce', '') or '' @@ -429,16 +396,12 @@ def load_events_by_category(category_id): except Error as e: error_msg = f"Ошибка базы данных: {e}" -# log_message(error_msg, "ERROR") - log_message(error_msg) - print(error_msg) + log_message(error_msg, "ERROR") if 'connection' in locals() and connection.is_connected(): connection.rollback() except Exception as e: error_msg = f"Общая ошибка: {e}" -# log_message(error_msg, "ERROR") - log_message(error_msg) - print(error_msg) + log_message(error_msg, "ERROR") finally: if 'connection' in locals() and connection.is_connected(): cursor.close() @@ -464,8 +427,7 @@ def load_all_events(): categories = cursor.fetchall() if not categories: -# log_message("В базе данных нет категорий для загрузки событий", "WARNING") - log_message("В базе данных нет категорий для загрузки событий") + log_message("В базе данных нет категорий для загрузки событий", "WARNING") cursor.close() connection.close() return @@ -487,9 +449,7 @@ def load_all_events(): processed_count += 1 except Exception as e: error_msg = f"Ошибка при загрузке событий для категории {category_id}: {e}" -# log_message(error_msg, "ERROR") - log_message(error_msg) - print(error_msg) + log_message(error_msg, "ERROR") # Продолжаем обработку других категорий continue @@ -497,14 +457,10 @@ def load_all_events(): except Error as e: error_msg = f"Ошибка базы данных при загрузке всех событий: {e}" -# log_message(error_msg, "ERROR") - log_message(error_msg) - print(error_msg) + log_message(error_msg, "ERROR") except Exception as e: error_msg = f"Общая ошибка при загрузке всех событий: {e}" -# log_message(error_msg, "ERROR") - log_message(error_msg) - print(error_msg) + log_message(error_msg, "ERROR") if __name__ == "__main__": load_categories()