Rusksnc / app.py
Aleksmorshen's picture
Create app.py
39ba81d verified
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)