✅ Разбор ответов на самопроверку
Блок 1: HTTP и REST
Вопрос 1: HTTP-методы
HTTP-методы — стандартизированные команды, которые клиент использует для взаимодействия с сервером. Основные методы:
| Метод | CRUD | Идемпотентен? |
|---|---|---|
| GET | Read | Да |
| POST | Create | Нет |
| PUT | Update (полный) | Да |
| PATCH | Update (частичный) | Да |
| DELETE | Delete | Да |
Вопрос 2: Идемпотентность
Идемпотентность — повторное выполнение операции даёт тот же результат, что и однократное.
DELETE идемпотентен: удалить вопрос с id=1 дважды — результат тот же (вопрос отсутствует). Первый вызов удаляет, второй возвращает 404 — но итоговое состояние ресурса неизменно.
POST не идемпотентен: каждый вызов создаёт новый ресурс с новым id.
Вопрос 3: API vs веб-приложение
API — интерфейс для взаимодействия между программами: определяет методы, форматы, URL, ожидаемые ответы.
Веб-приложение — ПО для конечного пользователя через браузер, может использовать API внутри.
Пример: Google Maps API используется и в Яндекс.Такси, и в приложениях доставки еды, и в навигаторах — одно API, множество приложений.
Вопрос 4: Принципы RESTful
- Клиент-сервер — разделение ответственности
- Без сохранения состояния — каждый запрос содержит всю нужную информацию
- Кэшируемость — ответы могут кэшироваться
- Единообразие интерфейса — ресурсы по URL, стандартные методы
- Многоуровневость — клиент не знает количество промежуточных слоёв
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: Преимущества модульной структуры
- Модульность — изолированные компоненты, изменения в одном не ломают другое
- Поддержка и развитие — легко найти и исправить нужный код
- Масштабируемость — добавление новых модулей без рефакторинга
- Переиспользование кода — схемы/модели можно использовать в нескольких 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: formrequest.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)