Технологический стек
Обоснование выбора технологий для проекта.
Backend: Django 5.2.7 + Python 3.9+
Почему Django?
- ✅ Скорость разработки
Admin panel из коробки, ORM, встроенная аутентификация
- ✅ Безопасность
Защита от SQL-инъекций, XSS, CSRF по умолчанию
- ✅ XP-friendly
Идеально подходит для быстрых итераций и малых релизов
- ✅ Документация
Отличная документация для быстрого старта
Database: SQLite
Почему SQLite?
- ✅ Нулевая настройка
Файловая БД, не требует установки сервера
- ✅ Достаточно для MVP
Подходит для демонстрации и разработки
- ✅ Легко мигрировать
При масштабировании легко переключиться на PostgreSQL
Frontend: Django Templates + Bootstrap 5
Почему не SPA?
- ✅ Простота
Server-side rendering без сложной инфраструктуры
- ✅ Скорость разработки
Не нужна сборка, API, состояние на клиенте
- ✅ XP принцип
Самое простое решение, которое работает
Линтеры и форматтеры
Инструменты качества кода:
flake8==7.1.1 # PEP 8 проверки
black==24.10.0 # Автоформатирование
isort==5.13.2 # Сортировка импортов
pylint==3.3.1 # Глубокий анализ кода
pylint-django==2.5.5 # Django-специфичные правила
Почему эти инструменты?
Обеспечивают единый стиль кода (важно для коллективного владения)
Автоматизируют code review (находят ошибки до ревьюера)
Интегрируются в CI/CD
Документация: Sphinx + Google Style Docstrings
Sphinx==8.1.3 # Генератор документации
sphinx-rtd-theme==3.0.2 # Тема ReadTheDocs
sphinx-autodoc-typehints==2.5.0 # Автодокументация
Почему Sphinx?
- ✅ Генерирует документацию из docstrings
DRY принцип - документация из кода
- ✅ Автоматическое обновление
Через GitHub Actions
- ✅ Профессиональный вид
ReadTheDocs тема
Пример docstring в Google Style
def create_course(title: str, description: str, teacher: User) -> Course:
"""
Создает новый курс с указанным преподавателем.
Args:
title: Название курса.
description: Описание курса.
teacher: Пользователь с ролью преподавателя.
Returns:
Созданный объект Course.
Raises:
ValueError: Если teacher не является преподавателем.
Examples:
>>> teacher = User.objects.get(username='teacher1')
>>> course = create_course('Python', 'Основы Python', teacher)
>>> print(course.title)
Python
"""
if not teacher.profile.is_teacher:
raise ValueError("User must be a teacher")
course = Course.objects.create(
title=title,
description=description
)
course.teachers.add(teacher)
return course