Загрузка данных
```python
from flask import Flask, request, redirect, session, render_template_string
app = Flask(__name__)
app.secret_key = "shop-secret-key-change-me"
USERS = [
{
"login": "admin",
"password": "1234",
"full_name": "Администратор"
}
]
PRODUCTS = [
{
"category": "Напитки",
"name": "Вода",
"description": "Питьевая вода",
"manufacturer": "Аква",
"supplier": "Поставщик 1",
"price": 50.00,
"unit": "шт.",
"quantity": 20,
"discount": 5
},
{
"category": "Продукты",
"name": "Шоколад",
"description": "Молочный шоколад",
"manufacturer": "Сладость",
"supplier": "Поставщик 2",
"price": 120.00,
"unit": "шт.",
"quantity": 0,
"discount": 20
},
{
"category": "Бытовая химия",
"name": "Мыло",
"description": "Мыло для рук",
"manufacturer": "Чистота",
"supplier": "Поставщик 3",
"price": 80.00,
"unit": "шт.",
"quantity": 15,
"discount": 18
}
]
HTML = """
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{ title }}</title>
<style>
body {
font-family: Arial, sans-serif;
background: #f2f2f2;
margin: 0;
padding: 20px;
}
.container {
max-width: 900px;
margin: auto;
}
.box {
background: white;
padding: 22px;
border-radius: 8px;
margin-bottom: 15px;
box-shadow: 0 2px 5px #ccc;
}
input, button {
box-sizing: border-box;
padding: 10px;
margin: 5px 0;
width: 100%;
}
button {
background: #2878c8;
color: white;
border: none;
cursor: pointer;
border-radius: 4px;
}
button:hover {
background: #185a99;
}
.product {
display: flex;
justify-content: space-between;
gap: 15px;
padding: 15px;
margin-bottom: 10px;
border: 1px solid #999;
border-radius: 5px;
overflow-wrap: anywhere;
}
.info { flex: 1; }
.discount {
min-width: 75px;
display: flex;
align-items: center;
justify-content: center;
font-size: 22px;
font-weight: bold;
}
.out { background: #ADD8E6; }
.sale { background: #FFDEAD; }
.normal { background: white; }
.error { color: #c00; }
@media(max-width: 500px) {
.product { flex-direction: column; }
.discount { padding: 10px; }
}
</style>
</head>
<body>
<div class="container">
{% if not user %}
<div class="box">
<h2>Вход в систему</h2>
{% if error %}<p class="error">{{ error }}</p>{% endif %}
<form method="post" action="/login">
<label>Логин</label>
<input name="login" required>
<label>Пароль</label>
<input type="password" name="password" required>
<button type="submit">Войти</button>
</form>
<form method="post" action="/guest">
<button type="submit">Войти как гость</button>
</form>
<p>Тестовый вход: admin / 1234</p>
</div>
{% else %}
<div class="box">
<h2>Список товаров</h2>
<p>Пользователь: {{ user }}</p>
<form method="post" action="/logout">
<button type="submit">Выход</button>
</form>
</div>
{% for p in products %}
<div class="product
{% if p.quantity == 0 %}out
{% elif p.discount > 17 %}sale
{% else %}normal{% endif %}">
<div class="info">
<strong>{{ p.category }} | {{ p.name }}</strong>
<p>Описание: {{ p.description }}</p>
<p>Производитель: {{ p.manufacturer }}</p>
<p>Поставщик: {{ p.supplier }}</p>
<p>Цена: {{ "%.2f"|format(p.price) }}</p>
<p>Единица измерения: {{ p.unit }}</p>
<p>Количество на складе: {{ p.quantity }}</p>
</div>
<div class="discount">{{ p.discount }}%</div>
</div>
{% endfor %}
{% endif %}
</div>
</body>
</html>
"""
@app.route("/")
def index():
return render_template_string(
HTML,
title="Список товаров",
user=session.get("user"),
products=PRODUCTS,
error=None
)
@app.route("/login", methods=["POST"])
def login():
login_name = request.form.get("login", "").strip()
password = request.form.get("password", "")
for user in USERS:
if user["login"] == login_name and user["password"] == password:
session["user"] = user["full_name"]
return redirect("/")
return render_template_string(
HTML,
title="Авторизация",
user=None,
products=PRODUCTS,
error="Неверный логин или пароль"
), 401
@app.route("/guest", methods=["POST"])
def guest():
session["user"] = "Гость"
return redirect("/")
@app.route("/logout", methods=["POST"])
def logout():
session.clear()
return redirect("/")
if __name__ == "__main__":
app.run(debug=False, host="127.0.0.1", port=5000)
```