API и endpoints
Справочник всех URL-маршрутов проекта. Это серверный сайт (не REST API): большинство адресов отдают готовые HTML-страницы. Исключение — форма заявки, которая работает через HTMX и возвращает HTML-фрагменты.
Маршруты собираются в config/urls.py
и подключённых urls.py приложений.
Страницы (apps.pages)
| Путь | Имя | Метод | Описание |
|---|---|---|---|
/ |
home |
GET | Главная страница. |
/dostavka/ |
dostavka |
GET | Доставка. |
/o-kompanii/ |
o_kompanii |
GET | О компании (+ галерея сертификатов). |
/kontakty/ |
kontakty |
GET | Контакты и реквизиты. |
/politika-konfidencialnosti/ |
politika |
GET | Политика конфиденциальности. |
/soglasie-na-obrabotku-pdn/ |
soglasie |
GET | Согласие на обработку ПДн. |
Два отдельных юридических документа
Политика конфиденциальности и согласие на обработку ПДн — разные страницы по требованию 152-ФЗ. См. Соответствие 152-ФЗ.
Каталог (apps.catalog)
Подключён с префиксом /catalog/.
| Путь | Имя | Метод | Описание |
|---|---|---|---|
/catalog/ |
category_list |
GET | Список категорий (хаб каталога). |
/catalog/<category_slug>/ |
category_detail |
GET | Категория со списком товаров. |
/catalog/<category_slug>/<slug>/ |
product_detail |
GET | Карточка товара (характеристики + галерея + форма). |
Параметры пути — это slug категории и товара. Показываются только записи
с is_active=True; для отсутствующих или скрытых — 404.
Запросы оптимизированы: product_detail использует select_related('category')
и prefetch_related('specs', 'images'), чтобы не плодить SQL-запросы.
Форма заявки (apps.leads)
| Путь | Имя | Метод | Описание |
|---|---|---|---|
/lead/ |
lead_form |
GET / POST | Отправка заявки. Работает через HTMX. |
Поведение
- GET — рендерит пустую форму (используется как include на страницах).
- POST, форма валидна — сохраняет заявку, ставит в очередь уведомления,
возвращает фрагмент
leads/success.html(«спасибо»). Статус 200. - POST, ошибки валидации — возвращает фрагмент полей с подсветкой ошибок
(
leads/form_fields.html). Статус 200 (HTMX подставляет фрагмент на место). - Превышен лимит — фрагмент
leads/ratelimit.html. Статус 429.
Поля формы
| Поле | Обязательное | Примечание |
|---|---|---|
name |
да | Имя. |
phone |
да | Телефон. |
email |
нет | Если заполнен — проверяется формат. |
comment |
нет | Комментарий. |
type |
— | Тип заявки (callback / order). |
product |
нет | Скрытое поле — pk товара (на карточке товара). |
consent |
да | Согласие на обработку ПДн. Без галочки форма не отправляется. |
website |
— | Honeypot. Невидимое поле-ловушка; если заполнено — заявка отклоняется как спам. |
Защита
- CSRF — на всех POST-запросах (стандарт Django).
- Honeypot — скрытое поле
website; боты его заполняют, люди нет. - Rate limit — 5 заявок в час с одного IP. При превышении — 429.
В разработке лимит отключён (
RATELIMIT_ENABLE=Falseвdev).
Служебные (apps.core)
| Путь | Имя | Метод | Описание |
|---|---|---|---|
/cookie-consent/ |
cookie_consent |
POST | Сохраняет выбор пользователя по cookie. |
SEO
| Путь | Метод | Описание |
|---|---|---|
/sitemap.xml |
GET | Карта сайта (категории + товары), Django sitemaps. |
/robots.txt |
GET | Файл для поисковых роботов. |
Админка
| Путь | Метод | Описание |
|---|---|---|
/admin/ |
GET / POST | Панель управления Django. Требует входа администратора. |
Работа в админке описана в разделе Добавить контент через админку.
Media (загруженные файлы)
| Путь | Описание |
|---|---|
/media/... |
Загруженные через админку файлы (фото товаров, сертификаты). |
В разработке раздаётся самим Django (только при DEBUG=True). На проде — через
отдельный сервис nginx (media).
Сводка кодов ответов
| Код | Когда |
|---|---|
| 200 | Успех; а также фрагменты формы (успех и ошибки валидации). |
| 403 | Нет/невалидный CSRF-токен. |
| 404 | Несуществующая или скрытая (is_active=False) категория/товар. |
| 429 | Превышен лимит заявок (5/час с IP). |