Вопросы по FastAPI, Django и дизайну API на собеседовании
Веб-секция на собесе Python-разработчика редко про синтаксис фреймворка. Спрашивают, чем ASGI отличается от WSGI, как вы версионируете API и что вернёте клиенту, когда запрос пришёл повторно.
Что спрашивают
- +FastAPI: валидация через Pydantic, зависимости, фоновые задачи, где асинхронность реально помогает
- +Django и DRF: ORM и запросы к базе, сериализаторы, middleware, типичные проблемы производительности
- +WSGI и ASGI: в чём разница, что меняется для блокирующего кода, как устроен запуск приложения
- +Дизайн REST: коды ответов, идемпотентность, пагинация, версионирование, обработка ошибок
- +Эксплуатация: таймауты, ретраи, ограничение частоты запросов, что отдавать при деградации зависимостей
Из чего состоит тема
Так тема разложена в тренажёре: движок ведёт прогресс по каждой подтеме отдельно и возвращает те, где вы ошибаетесь.
- Чистая архитектура15
- Django и DRF14
- FastAPI и Pydantic14
- Flask14
- Middleware и зависимости13
- WSGI и ASGI13
- GraphQL12
- Rate limiting12
- WebSockets и стриминг12
- Аутентификация и авторизация12
- Веб-безопасность12
- Пагинация и фильтрация12
- Семантика HTTP12
- Валидация и сериализация11
- Версионирование API11
- Дизайн REST11
- Идемпотентность и gRPC11
Разборы подтем
Конспект по каждой: что это, как отвечать вслух, на чём валятся, плюс вопросы для самопроверки.
- REST API: методы, коды ответов и дизайн ресурсов11 вопросов
- Версионирование API11 вопросов
- Аутентификация и авторизация в API12 вопросов
- GraphQL12 вопросов
- Семантика HTTP12 вопросов
- Идемпотентность и gRPC11 вопросов
- Пагинация и фильтрация в API12 вопросов
- Rate limiting в API12 вопросов
- Валидация и сериализация данных11 вопросов
- Веб-безопасность API12 вопросов
- Чистая архитектура в Python15 вопросов
- Django и DRF14 вопросов
- FastAPI и Pydantic14 вопросов
- Flask: основы14 вопросов
- Middleware и зависимости13 вопросов
- WebSockets и стриминг12 вопросов
- WSGI и ASGI13 вопросов
Примеры вопросов с разбором
- Зачем версионировать публичный API?A)Это формальность стандарта, на поведение никак не влияетB)Чтобы ускорить ответы новой версии за счёт свежего кэшаC)Менять контракт, не ломая уже работающих клиентовD)Чтобы поисковики лучше индексировали эндпоинты приложения
показать ответ и разбор
+C)Менять контракт, не ломая уже работающих клиентов// разбор: У публичного API есть внешние клиенты, которых нельзя обновить одномоментно. Версионирование (v1, v2) позволяет вводить несовместимые изменения в новой версии, пока старые клиенты продолжают жить на прежней. Без него любое ломающее изменение кладёт чужие интеграции.
- Пользователь с валидным токеном пытается удалить чужой заказ и получает отказ. Что сработало?A)Валидация входа: тело запроса на удаление сформировано неверноB)Ограничение частоты запросов, сработавшее на этом клиентеC)Авторизация: личность известна, но прав на действие нетD)Аутентификация: система не смогла подтвердить его личность вообще
показать ответ и разбор
+C)Авторизация: личность известна, но прав на действие нет// разбор: Личность подтверждена — токен валиден, аутентификация прошла. Отказ из-за отсутствия прав на чужой ресурс — это авторизация (обычно 403 Forbidden). Аутентификация отвечает «кто ты», авторизация — «что тебе можно»; здесь провалилась именно вторая проверка, а не первая.
- Клиенту нужно 3 поля из объекта, а REST-эндпоинт отдаёт 30. В GraphQL это решается как?A)Клиент в запросе перечисляет нужные поля — приходит только ониB)Сервер заранее заводит по эндпоинту под каждый возможный набор полейC)Клиент качает все 30 полей и отбрасывает лишние уже на своей сторонеD)GraphQL сжимает неиспользуемые поля до нуля байт при передаче по сети автоматически
показать ответ и разбор
+A)Клиент в запросе перечисляет нужные поля — приходит только они// разбор: В GraphQL клиент описывает в запросе точный набор нужных полей, и сервер возвращает ровно их — это лечит over-fetching (лишние поля) и under-fetching (нехватку, из-за которой в REST делают несколько запросов). Форму ответа определяет клиент, а не фиксированный эндпоинт.
- Что по смыслу делают методы GET, POST, PUT, DELETE?A)Читать, создавать, заменять и удалять ресурсB)GET изменяет данные, а POST только читает их с сервераC)Разница чисто историческая, сервер трактует их одинаковоD)Все четыре только читают данные, но с разной скоростью ответа
показать ответ и разбор
+A)Читать, создавать, заменять и удалять ресурс// разбор: GET — безопасное чтение (не меняет состояние), POST — создать/выполнить действие, PUT — заменить ресурс целиком, DELETE — удалить. GET и HEAD «безопасны» (не должны менять данные), что позволяет их кэшировать и повторять без опаски.
- Что значит «идемпотентная операция»?A)Операция, требующая ровно одну попытку и запрещающая ретраиB)Повтор не меняет результат по сравнению с одним вызовомC)Операция, которая выполняется за фиксированное времяD)Операция, работающая только внутри одной транзакции базы данных
показать ответ и разбор
+B)Повтор не меняет результат по сравнению с одним вызовом// разбор: Идемпотентность: повторное применение операции с теми же параметрами приводит к тому же итоговому состоянию, что и однократное. Важна для надёжности: при таймаутах и ретраях клиент может послать запрос дважды — идемпотентная операция не создаст дубль и не спишет деньги повторно.
- Почему список сущностей нельзя отдавать одним ответом целиком?A)Потому что клиент не разберёт большой массив и упадёт на нёмB)Потому что база данных запрещает возвращать более одной строки без пагинацииC)На больших объёмах это грузит память и сеть — данные отдают страницамиD)Потому что JSON технически не способен содержать массив более чем из ста элементов
показать ответ и разбор
+C)На больших объёмах это грузит память и сеть — данные отдают страницами// разбор: Отдать таблицу из миллионов строк одним ответом — значит выбрать всё из БД, собрать в памяти, сериализовать и прогнать по сети: удар по памяти сервера, задержке и трафику, риск таймаутов. Поэтому большие коллекции отдают страницами фиксированного размера, а клиент запрашивает следующие по мере надобности. Плюс на размер страницы ставят потолок.
- Зачем API вообще ограничивать частоту запросов (rate limiting)?A)Чтобы шифровать трафик и защитить передаваемые данные от перехвата в сетиB)Защитить от перегрузки и злоупотреблений, честно поделив ресурсC)Чтобы клиенты чаще обновляли приложение до последней доступной версии APID)Чтобы намеренно замедлить всех пользователей и сэкономить на мощности серверов
показать ответ и разбор
+B)Защитить от перегрузки и злоупотреблений, честно поделив ресурс// разбор: Rate limiting ограничивает число запросов за окно времени: защищает от перегрузки (случайной лавины, DDoS), пресекает злоупотребления (скрейпинг, перебор паролей), обеспечивает справедливое распределение между клиентами и предсказуемую нагрузку. Превышение лимита сервер отклоняет статусом 429, часто подсказывая, когда повторить.
- Как в REST принято выражать ресурс и действие над ним?A)Действие кладут в тело POST, а метод оставляют GETB)URL — существительное-ресурс, действие — HTTP-методC)Действие указывают query-параметром, а метод не важен вообщеD)И ресурс, и действие кодируют глаголом прямо внутри пути URL
показать ответ и разбор
+B)URL — существительное-ресурс, действие — HTTP-метод// разбор: REST моделирует данные как ресурсы: путь — существительное (/users, /users/1), а действие выражает HTTP-метод (GET читать, POST создать, DELETE удалить). Глаголы в пути (/getUsers, /deleteUser) — антипаттерн: они дублируют семантику метода и ломают единообразие.
- Почему вход API обязательно валидировать на сервере?A)Достаточно проверки на клиенте, серверная — лишняя перестраховкаB)Клиенту доверять нельзя — данные могут быть любымиC)Валидация нужна лишь для красивых сообщений об ошибках в UID)Сервер валидирует только ради ускорения последующих запросов
показать ответ и разбор
+B)Клиенту доверять нельзя — данные могут быть любыми// разбор: Любой клиент (браузер, curl, чужой скрипт) может прислать что угодно в обход UI-проверок, поэтому сервер — единственная надёжная граница доверия: он валидирует типы, диапазоны и инварианты до записи. Клиентская валидация — про UX, серверная — про корректность и безопасность.
это 9 из 211
Ещё 202 вопросов по теме — в тренажёре, с движком повторения
Прочитать разбор и ответить самому — разные навыки. В Сеньорчике вопросы идут сессиями, а движок возвращает подтемы, где вы ошибаетесь, пока они не начнут отскакивать. Бесплатно, лимит по энергии.
Частые вопросы
FastAPI или Django спрашивают чаще?
Зависит от стека вакансии, но вопросы про устройство обычно общие: маршрутизация, валидация, работа с базой, обработка ошибок. Знание одного фреймворка помогает отвечать про другой.
Что такое идемпотентность и зачем её спрашивают?
Свойство операции давать один и тот же результат при повторном выполнении. Спрашивают, потому что ретраи и дубли запросов есть в любой системе, и от ответа зависит, развалится ли она под нагрузкой.
Нужно ли знать ASGI, если пишете на Django?
Полезно: вопрос про разницу с WSGI задают часто, а Django давно умеет работать в асинхронном режиме. Достаточно понимать модель и её ограничения.