Spaces:
Runtime error
Runtime error
File size: 5,354 Bytes
39ba81d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
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
@app.route("/")
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)
@app.route("/add", methods=["GET", "POST"])
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) |