✅ Разбор ответов на самопроверку

Блок 1: HTTP и REST

Вопрос 1: HTTP-методы

HTTP-методы — стандартизированные команды, которые клиент использует для взаимодействия с сервером. Основные методы:

МетодCRUDИдемпотентен?
GETReadДа
POSTCreateНет
PUTUpdate (полный)Да
PATCHUpdate (частичный)Да
DELETEDeleteДа
Вопрос 2: Идемпотентность

Идемпотентность — повторное выполнение операции даёт тот же результат, что и однократное.

DELETE идемпотентен: удалить вопрос с id=1 дважды — результат тот же (вопрос отсутствует). Первый вызов удаляет, второй возвращает 404 — но итоговое состояние ресурса неизменно.

POST не идемпотентен: каждый вызов создаёт новый ресурс с новым id.

Вопрос 3: API vs веб-приложение

API — интерфейс для взаимодействия между программами: определяет методы, форматы, URL, ожидаемые ответы.

Веб-приложение — ПО для конечного пользователя через браузер, может использовать API внутри.

Пример: Google Maps API используется и в Яндекс.Такси, и в приложениях доставки еды, и в навигаторах — одно API, множество приложений.

Вопрос 4: Принципы RESTful
  1. Клиент-сервер — разделение ответственности
  2. Без сохранения состояния — каждый запрос содержит всю нужную информацию
  3. Кэшируемость — ответы могут кэшироваться
  4. Единообразие интерфейса — ресурсы по URL, стандартные методы
  5. Многоуровневость — клиент не знает количество промежуточных слоёв

RESTful vs SOAP: REST проще и быстрее; SOAP строже по правилам и даёт больше гарантий безопасности, но менее гибкий.

Блок 2: Flask — конфигурация и маршрутизация

Вопрос 5: Config-классы

Иерархия Config-классов позволяет иметь разные настройки для разных окружений без дублирования. Общие параметры — в базовом Config, специфичные — в подклассах.

config_name = os.environ.get('FLASK_ENV', 'development')
config_class = {'development': DevelopmentConfig, ...}.get(config_name)
app.config.from_object(config_class)
Вопрос 6: Blueprint

Blueprint — способ организовать группу связанных маршрутов в отдельный модуль. Регистрируется в приложении через app.register_blueprint(bp, url_prefix='/...').

Преимущества: Модульность (каждый Blueprint в своём файле), Повторное использование (можно подключить к другому приложению), Масштабируемость (новые разделы без изменения ядра).

Вопрос 7: __init__.py и Application Factory

app/__init__.py инициализирует Flask-приложение: создаёт объект app, настраивает конфигурацию, подключает db, Migrate, регистрирует Blueprints.

Application Factory — функция create_app(), которая каждый раз создаёт новый экземпляр приложения. Это позволяет легко создавать тестовые экземпляры с другими настройками и избегает глобального состояния.

Блок 3: Структура проекта

Вопрос 8: Папки проекта
  • routers/ — обработчики маршрутов (Blueprints), логика HTTP-взаимодействия
  • models/ — структура БД (ORM-классы), связи между таблицами
  • schemas/ — Pydantic-схемы, валидация входных данных и сериализация ответов

Разделение реализует принцип Single Responsibility: каждый слой отвечает за своё.

Вопрос 9: Преимущества модульной структуры
  1. Модульность — изолированные компоненты, изменения в одном не ломают другое
  2. Поддержка и развитие — легко найти и исправить нужный код
  3. Масштабируемость — добавление новых модулей без рефакторинга
  4. Переиспользование кода — схемы/модели можно использовать в нескольких Blueprints

Блок 4: Flask-SQLAlchemy и миграции

Вопрос 10: Flask-SQLAlchemy

Flask-SQLAlchemy — расширение, которое упрощает использование SQLAlchemy в Flask-приложениях. Преимущества: автоматическое управление сессиями (открытие/закрытие), интеграция с конфигурацией Flask, более компактный синтаксис (db.Model вместо Base).

Вопрос 11: Alembic vs Flask-Migrate

Alembic — общий инструмент миграций для любого Python-приложения с SQLAlchemy. Полный контроль, подходит для не-Flask проектов.

Flask-Migrate — обёртка над Alembic, добавляет команды flask db ... и автоматически использует конфигурацию Flask-приложения. Предпочтительнее для Flask-проектов из-за удобства.

Вопрос 12: Команды миграции
flask db init                          # Инициализация (один раз)
flask db migrate -m "Initial migration" # Создать файл миграции
flask db upgrade                       # Применить к БД
flask db downgrade                     # Откатить последнюю

Блок 5: Эндпоинты и Pydantic

Вопрос 13: Объект request
  • request.args — параметры строки запроса (?key=val), GET-параметры
  • request.form — данные HTML-формы, POST-запрос с Content-Type: form
  • request.get_json() — JSON из тела запроса (Content-Type: application/json)
  • request.method, request.headers, request.files, request.data

request.get_json() используется при работе с REST API, где клиент отправляет JSON-тело.

Вопрос 14: Контракты

Контракт — соглашение между бэкендом и фронтендом: URL + методы, форматы данных (входных и выходных), коды ответов, обработка ошибок.

Зачем нужен: ясность для команды, упрощение интеграции, упрощение тестирования, масштабируемость.

Вопрос 15: Pydantic-схема
from pydantic import BaseModel, Field, ConfigDict

class QuestionCreate(BaseModel):
    text: str = Field(..., min_length=12, description="Текст вопроса")

class QuestionResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    id: int
    text: str

# Использование в эндпоинте:
# QuestionResponse.model_validate(orm_question).model_dump()
Итоговый вопрос: масштабирование Community Pulse

Flask + SQLAlchemy + Pydantic позволяют создавать надёжные, масштабируемые приложения. Возможные направления масштабирования Community Pulse:

  • Добавить категории вопросов (новая модель Category, Blueprint categories)
  • Добавить аутентификацию (Flask-Login или JWT)
  • Переключиться на PostgreSQL для продуктивного окружения
  • Добавить кэширование (Flask-Caching, Redis)
  • Покрыть тестами (pytest + pytest-flask)