Введение: почему Flask?
Когда речь заходит о создании интернет-магазина, на ум сразу приходят тяжеловесные платформы вроде WordPress + WooCommerce или 1C-Битрикс. Они мощные, но часто избыточные. Для стартапа, нишевого проекта или для разработчика, который хочет понять все процессы изнутри, идеальным выбором может стать Flask.
Flask — это микрофреймворк для Python. «Микро» не означает слабый. Это означает, что он предоставляет только базовые компоненты (маршрутизацию, шаблоны, сессии), а все остальное вы добавляете по мере необходимости. Это дает невероятную гибкость и контроль.
В этой статье мы разберем ключевые этапы создания интернет-магазина на Flask и его основные компоненты.
Планирование и структура проекта
Перед написанием кода определитесь с базовой функциональностью:
-
Каталог товаров с категориями
-
Корзина покупок
-
Оформление заказа
-
Личный кабинет пользователя
-
Панель администратора (управление товарами, заказами)
Структура вашего проекта может выглядеть так:
/my_shop
/app
/templates # HTML-шаблоны
/static # CSS, JS, изображения
/css
/js
/uploads # Картинки товаров
/models.py # Модели базы данных (Товар, Пользователь, Заказ)
/routes.py # Маршруты (страницы сайта)
/forms.py # Формы для входа, регистрации, заказа
__init__.py # Инициализация приложения
config.py # Конфигурация (ключи, настройки БД)
run.py # Точка входа для запуска
База данных и модели (SQLAlchemy)
Сердце любого магазина — данные. Используем Flask-SQLAlchemy для работы с базой данных (например, SQLite для начала, потом PostgreSQL для продакшена).
Пример моделей в models.py:
from app import db
class Product(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
price = db.Column(db.Float, nullable=False)
description = db.Column(db.Text)
image = db.Column(db.String(200))
category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
class Category(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), unique=True, nullable=False)
products = db.relationship('Product', backref='category', lazy=True)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(100), unique=True, nullable=False)
password_hash = db.Column(db.String(200), nullable=False)
class Order(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
total = db.Column(db.Float, nullable=False)
status = db.Column(db.String(20), default='Новый')
items = db.relationship('OrderItem', backref='order', lazy=True)
class OrderItem(db.Model):
id = db.Column(db.Integer, primary_key=True)
order_id = db.Column(db.Integer, db.ForeignKey('order.id'))
product_id = db.Column(db.Integer, db.ForeignKey('product.id'))
quantity = db.Column(db.Integer, nullable=False)
Маршруты и логика (Flask routes)
В routes.py описываем, что происходит на каждой странице.
Пример главной страницы и каталога:
from flask import render_template
from app.models import Product, Category
@app.route('/')
def index():
products = Product.query.limit(8).all() # 8 товаров на главную
return render_template('index.html', products=products)
@app.route('/catalog/<int:category_id>')
def catalog(category_id):
category = Category.query.get_or_404(category_id)
products = Product.query.filter_by(category_id=category_id).all()
return render_template('catalog.html', category=category, products=products)
Корзина покупок
Корзину можно хранить в сессии Flask (для неавторизованных пользователей) или в базе данных (для зарегистрированных). Это простой словарь в сессии, где ключ — ID товара, а значение — количество.
Добавление в корзину:
from flask import session
@app.route('/add_to_cart/<int:product_id>')
def add_to_cart(product_id):
cart = session.get('cart', {})
cart[str(product_id)] = cart.get(str(product_id), 0) + 1
session['cart'] = cart
return {'message': 'Товар добавлен!'}, 200
Оформление заказа и оплата
После заполнения формы заказа (адрес, контакты) данные сохраняются в таблицы Order и OrderItem.
Для приема платежей вам понадобятся внешние API:
-
ЮKassa (бывшая Яндекс.Касса) — популярное решение для РФ.
-
Stripe — для международных платежей.
-
Robokassa, PayPal и другие.
Интеграция выглядит так:
-
Создаете заказ в своей БД со статусом
"ожидает оплаты". -
Перенаправляете пользователя на страницу платежного шлюза.
-
Платежный шлюз возвращает пользователя на ваш сайт (на специальный
webhookили callback-URL). -
Вы проверяете статус платежа и меняете статус заказа на
"оплачен".
Панель администратора (Flask-Admin)
Быстро создать админ-панель для управления товарами и заказами поможет расширение Flask-Admin.
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView
admin = Admin(app, name='Магазин', template_mode='bootstrap3')
admin.add_view(ModelView(Product, db.session))
admin.add_view(ModelView(Category, db.session))
admin.add_view(ModelView(Order, db.session))
Автор: Евгений Морковин




0 комментариев
Оставьте комментарий
Комментарии