Spaces:
Runtime error
Runtime error
from flask import Flask, render_template_string, request, redirect, url_for | |
from huggingface_hub import login, Dataset, hf_api | |
import os | |
from dotenv import load_dotenv | |
from werkzeug.utils import secure_filename | |
import shutil | |
# Загрузка переменных окружения | |
load_dotenv() | |
HF_TOKEN = os.getenv("HF_TOKEN") | |
# Логин в Hugging Face | |
login(token=HF_TOKEN) | |
# Загрузка датасета | |
dataset = Dataset("Aleksmorshen/ruslankanc") | |
# Параметры для загрузки изображений | |
UPLOAD_FOLDER = 'static/uploads' | |
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'} | |
os.makedirs(UPLOAD_FOLDER, exist_ok=True) | |
# Функция для проверки расширений изображений | |
def allowed_file(filename): | |
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS | |
# Инициализация Flask | |
app = Flask(__name__) | |
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER | |
def catalog(): | |
# Получаем все товары из датасета | |
catalog_data = dataset[:] | |
# HTML-шаблон | |
html_content = """ | |
<!DOCTYPE html> | |
<html lang="ru"> | |
<head> | |
<meta charset="UTF-8"> | |
<title>Интернет Каталог</title> | |
</head> | |
<body> | |
<h1>Каталог товаров</h1> | |
<ul> | |
{% for item in catalog_data %} | |
<li> | |
<strong>{{ item['name'] }}</strong><br> | |
{{ item['description'] }}<br> | |
Цена: ${{ item['price'] }}<br> | |
{% if item['image_url'] %} | |
<img src="{{ item['image_url'] }}" alt="{{ item['name'] }}" width="100"><br> | |
{% endif %} | |
</li> | |
{% endfor %} | |
</ul> | |
<a href="{{ url_for('add_product') }}">Добавить товар</a> | |
</body> | |
</html> | |
""" | |
return render_template_string(html_content, catalog_data=catalog_data) | |
def add_product(): | |
if request.method == "POST": | |
# Получаем данные формы | |
name = request.form["name"] | |
description = request.form["description"] | |
price = request.form["price"] | |
# Обработка файла изображения | |
image_url = None | |
if "image" in request.files: | |
file = request.files["image"] | |
if file and allowed_file(file.filename): | |
filename = secure_filename(file.filename) | |
filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename) | |
file.save(filepath) | |
# Загружаем изображение в Hugging Face и получаем ссылку | |
image_url = upload_image_to_hf(filepath, filename) | |
# Добавление товара в датасет | |
dataset.push({ | |
'name': name, | |
'description': description, | |
'price': float(price), | |
'image_url': image_url | |
}) | |
return redirect(url_for('catalog')) | |
# HTML-шаблон для добавления товара | |
html_content = """ | |
<!DOCTYPE html> | |
<html lang="ru"> | |
<head> | |
<meta charset="UTF-8"> | |
<title>Добавить товар</title> | |
</head> | |
<body> | |
<h1>Добавить новый товар</h1> | |
<form method="POST" enctype="multipart/form-data"> | |
<label for="name">Название:</label><br> | |
<input type="text" id="name" name="name" required><br><br> | |
<label for="description">Описание:</label><br> | |
<textarea id="description" name="description" required></textarea><br><br> | |
<label for="price">Цена:</label><br> | |
<input type="number" step="0.01" id="price" name="price" required><br><br> | |
<label for="image">Изображение:</label><br> | |
<input type="file" id="image" name="image"><br><br> | |
<button type="submit">Добавить товар</button> | |
</form> | |
<br> | |
<a href="{{ url_for('catalog') }}">Вернуться к каталогу</a> | |
</body> | |
</html> | |
""" | |
return render_template_string(html_content) | |
def upload_image_to_hf(filepath, filename): | |
"""Загружает изображение в Hugging Face и возвращает ссылку на него""" | |
# Например, можно загружать изображение в Hugging Face Hub как артефакт (вместо этого используйте URL облачного сервиса) | |
image_url = f"https://huggingface.co/{HF_TOKEN}/path/to/{filename}" | |
# Здесь можно использовать API для загрузки в Hugging Face, если это необходимо. | |
# Для примера, мы возвращаем путь, как будто оно загружено. | |
shutil.move(filepath, os.path.join("hf_uploads", filename)) # Имитация загрузки в систему | |
return image_url | |
# Запуск приложения | |
if __name__ == "__main__": | |
app.run(debug=True, port=7860) |