from flask import Flask, render_template_string, request, redirect, url_for, send_from_directory
import json
import os
import logging
import threading
import time
from datetime import datetime
from huggingface_hub import HfApi, hf_hub_download
from huggingface_hub.utils import RepositoryNotFoundError, HfHubHTTPError
from werkzeug.utils import secure_filename
import urllib.parse
app = Flask(__name__)
DATA_FILE = 'dataasdem.json'
PHOTOS_DIR = 'photos'
REPO_ID = "flpolprojects/dataasdem"
HF_TOKEN_WRITE = os.getenv("HF_TOKEN")
HF_TOKEN_READ = os.getenv("HF_TOKEN_READ")
LOGO_URL = "https://cdn-avatars.huggingface.co/v1/production/uploads/67b22aaeae9b6a59f1cfb849/NQvBksXzJItYt6hfFjyaB.jpeg"
logging.basicConfig(level=logging.DEBUG)
def load_data():
try:
download_db_from_hf()
with open(DATA_FILE, 'r', encoding='utf-8') as file:
data = json.load(file)
logging.info("Данные успешно загружены из JSON")
if not isinstance(data, dict) or 'products' not in data or 'categories' not in data:
if isinstance(data, list):
return {'products': data, 'categories': []}
else:
logging.warning("Неожиданный формат данных в JSON.")
return {'products': [], 'categories': []}
return data
except FileNotFoundError:
logging.warning(f"Локальный файл базы данных ({DATA_FILE}) не найден после скачивания.")
return {'products': [], 'categories': []}
except json.JSONDecodeError:
logging.error("Ошибка: Невозможно декодировать JSON файл.")
return {'products': [], 'categories': []}
except RepositoryNotFoundError:
logging.error(f"Репозиторий '{REPO_ID}' не найден на Hugging Face. Создание локальной базы данных.")
return {'products': [], 'categories': []}
except HfHubHTTPError as e:
logging.error(f"Ошибка HTTP при скачивании из Hugging Face: {e}")
logging.warning(f"Попытка загрузить локальный файл '{DATA_FILE}' если существует.")
try:
with open(DATA_FILE, 'r', encoding='utf-8') as file:
data = json.load(file)
logging.info("Данные успешно загружены из локального JSON после ошибки HF.")
if not isinstance(data, dict) or 'products' not in data or 'categories' not in data:
if isinstance(data, list):
return {'products': data, 'categories': []}
else:
logging.warning("Неожиданный формат данных в локальном JSON.")
return {'products': [], 'categories': []}
return data
except FileNotFoundError:
logging.warning(f"Локальный файл '{DATA_FILE}' также не найден.")
return {'products': [], 'categories': []}
except json.JSONDecodeError:
logging.error("Ошибка: Невозможно декодировать локальный JSON файл.")
return {'products': [], 'categories': []}
except Exception as e:
logging.error(f"Произошла неизвестная ошибка при загрузке данных: {e}")
return {'products': [], 'categories': []}
def save_data(data):
try:
with open(DATA_FILE, 'w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=4)
logging.info("Данные успешно сохранены в JSON")
upload_db_to_hf()
except Exception as e:
logging.error(f"Ошибка при сохранении данных: {e}")
raise
def upload_db_to_hf():
if not HF_TOKEN_WRITE:
logging.warning("HF_TOKEN не установлен. Пропуск загрузки на Hugging Face.")
return
try:
api = HfApi()
api.upload_file(
path_or_fileobj=DATA_FILE,
path_in_repo=DATA_FILE,
repo_id=REPO_ID,
repo_type="dataset",
token=HF_TOKEN_WRITE,
commit_message=f"Автоматическое резервное копирование базы данных {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
)
logging.info("Резервная копия JSON базы успешно загружена на Hugging Face.")
except Exception as e:
logging.error(f"Ошибка при загрузке резервной копии на Hugging Face: {e}")
def download_db_from_hf():
if not HF_TOKEN_READ:
logging.warning("HF_TOKEN_READ не установлен. Пропуск скачивания из Hugging Face.")
return
try:
hf_hub_download(
repo_id=REPO_ID,
filename=DATA_FILE,
repo_type="dataset",
token=HF_TOKEN_READ,
local_dir=".",
local_dir_use_symlinks=False
)
logging.info("JSON база успешно скачана из Hugging Face.")
except RepositoryNotFoundError:
logging.warning(f"Репозиторий '{REPO_ID}' не найден. Скачивание невозможно.")
raise
except Exception as e:
logging.error(f"Ошибка при скачивании JSON базы из Hugging Face: {e}")
raise
def periodic_backup():
while True:
upload_db_to_hf()
time.sleep(800)
catalog_html = '''
Asdem - нижнее белье оптом
Каталог
{% for category in categories %}
{% endfor %}
{% for product in products %}
{% if product.get('photos') and product['photos']|length > 0 %}
{% endif %}
{{ product['name']|e }}
{{ product['price'] }} с
{{ product['description'][:100] }}{% if product['description']|length > 100 %}...{% endif %}
{% endfor %}
×
×
Укажите количество и цвет
×
Корзина
Итого: 0 с
'''
detail_html = '''
{{ product['name']|e }}
{% if product.get('photos') %}
{% for photo in product['photos'] %}
{% endfor %}
{% else %}
{% endif %}
{% if product.get('photos') and product['photos']|length > 1 %}
{% endif %}