Технологический стек

Обоснование выбора технологий для проекта.

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