Веб‑платформа для публикации новостей, научных работ, проектов и ресурсов Лабораторий информационной безопасности Московского политеха. Проект построен на Django и Django REST Framework с одностраничным фронтендом на Tailwind CSS и Vanilla JavaScript.
- Описание
- Возможности
- Технологии
- Установка
- Настройка окружения
- Запуск в режиме разработки
- Развертывание через Docker
- API
- Администрирование
- Тестирование
Сайт демонстрирует деятельность лаборатории: новости, публикации, текущие исследовательские проекты, список сотрудников и интерактивную форму обратной связи. Бэк‑энд предоставляет REST API для использования контента во внешних сервисах или мобильных приложениях.
Модуль | Описание |
---|---|
Новости | Лента с пагинацией, детальная страница, фотогалерея |
Публикации | База научных статей с возможностью скачивания PDF |
Сотрудники | Карточки персонала с биографией, фотографией и контактами |
Проекты | Каталог исследовательских и коммерческих проектов |
API | Открытый REST‑интерфейс (только чтение) для News, Publication, Staff, Project |
Админ‑панель | Удобное управление контентом, inline‑галерея для изображений новостей |
Контакт‑форма | Отправка сообщений с валидацией на клиенте (не реализовано) |
Адаптивный дизайн | Tailwind CSS обеспечивает корректное отображение на мобильных и десктопных устройствах |
- Python 3.12
- Django 5.2 – MVC‑фреймворк
- Django REST Framework – сериализация и ViewSet API
- MySQL 8.x – СУБД по умолчанию
- Tailwind CSS 3 – утилитарный CSS‑фреймворк
- Font Awesome 6 – иконки
- Vanilla JavaScript / Fetch API – загрузка данных на фронтенде
⚡ Build‑chain не требуется: Tailwind подключён через CDN, а скрипты – обычные ES‑модули.
# 1. Клонируем репозиторий
$ git clone https://github.com/<username>/infosec_lab_site.git
$ cd infosec_lab_site
# 2. Создаём и активируем виртуальное окружение
$ python -m venv venv
$ source venv/bin/activate # Windows: venv\Scripts\activate
# 3. Ставим зависимости
$ pip install -r requirements.txt
Создайте базу данных и пользователя MySQL:
CREATE DATABASE infosec_lab_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'infosec_user'@'localhost' IDENTIFIED BY '<пароль>';
GRANT ALL PRIVILEGES ON infosec_lab_db.* TO 'infosec_user'@'localhost';
FLUSH PRIVILEGES;
Файл settings.py
содержит базовые параметры.
Никогда не коммитьте секреты! В продакшене перенесите переменные в .env
или переменные окружения.
# .env (пример)
DJANGO_SECRET_KEY=ChangeMePlease
DJANGO_DEBUG=False
DJANGO_ALLOWED_HOSTS=your.domain.com,127.0.0.1
MYSQL_NAME=infosec_lab_db
MYSQL_USER=infosec_user
MYSQL_PASSWORD=<пароль>
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
# Миграции и суперпользователь
$ python manage.py migrate
$ python manage.py createsuperuser
# Запуск встроенного сервера
$ python manage.py runserver
Откройте: http://127.0.0.1:8000/
– главная страница
http://127.0.0.1:8000/api/
– browsable API
http://127.0.0.1:8000/admin/
– панель администратора.
Перед запуском убедитесь, что установлены Docker и Docker Compose.
Dockerfile
— инструкция сборки Django-приложения.docker-compose.yml
— конфигурация сервисаweb
(Django) +db
(MySQL)..env
— переменные окружения (не коммить в публичный репозиторий).
DJANGO_SECRET_KEY=ChangeMePlease
DJANGO_DEBUG=True
DJANGO_ALLOWED_HOSTS=127.0.0.1,localhost
MYSQL_DATABASE=infosec_lab_db
MYSQL_USER=infosec_user
MYSQL_PASSWORD=infosec_pass
MYSQL_ROOT_PASSWORD=root_pass
DB_HOST=db
DB_PORT=3306
# Сборка и запуск в фоне
$ docker-compose up --build -d
# Применение миграций
$ docker-compose exec web python manage.py migrate
# Создание суперпользователя
$ docker-compose exec web python manage.py createsuperuser
# Сбор статики
$ docker-compose exec web python manage.py collectstatic --noinput
Интерфейс | URL |
---|---|
Главная | http://127.0.0.1:8000/ |
API | http://127.0.0.1:8000/api/ |
Админка | http://127.0.0.1:8000/admin/ |
$ docker-compose down -v
Эндпоинт | Метод | Описание | Пагинация |
---|---|---|---|
/api/news/ |
GET | Список новостей (page, page_size) | ✔️ |
/api/news/{id}/ |
GET | Детальная новость | ❄️ |
/api/publications/ |
GET | Список публикаций | ✔️ |
/api/publications/{id}/ |
GET | Детальная публикация | ❄️ |
/api/staff/ |
GET | Список сотрудников | ❄️ (отключена) |
/api/staff/{id}/ |
GET | Карточка сотрудника | ❄️ |
/api/projects/ |
GET | Список проектов | ✔️ |
/api/projects/{id}/ |
GET | Детальный проект | ❄️ |
Параметры пагинации (DRF PageNumberPagination
):
{
"count": 12,
"next": "http://127.0.0.1:8000/api/news/?page=2",
"previous": null,
"results": [ ... ]
}
- Новости: поддержка inline добавления до 20 изображений к одной записи.
- Публикации: поля Название, Авторы, Журнал, Ссылка.
- Сотрудники: фотография, контакты, краткая биография.
- Проекты: период выполнения, цель, результаты, заказчик.
$ python manage.py test