FastAPI — частый вход в Python backend в CIS: типизированные эндпоинты, автодокументация, быстрый учебный контур. Это не «лучший фреймворк 2026» и не замена умению спроектировать схему данных. Вакансии проверяют сервис: валидация, БД, ошибки, тесты, деплой в Docker, честный README.

Ниже — карта до junior Python backend на FastAPI, 90-дневный проект, что писать в README и как стыковать поиск с вакансиями Python-разработчика. Общий Python: Python roadmap. Альтернатива, если в объявлениях Django: Django roadmap. Вход в роль: как стать Python-разработчиком и как стать backend-разработчиком.

Коротко:

  • Один сервис, не обзор Starlette/Flask/FastAPI сразу.
  • Pydantic-схемы, статус-коды, зависимость с сессией БД, миграции — ядро, не «hello world с swagger».
  • Тесты на создание сущности и на 422/404. Без них swagger не нанимает.
  • Docker Compose с Postgres. SQLite в портфолио backend допустим только с пометкой и пониманием отличий.
  • Готовность — clone, up, открывается /docs, тесты зелёные, в README написано, чего нет.

Когда FastAPI, когда нет

Берите FastAPI, если в пяти вакансиях он есть или написано «Python API, async, pydantic». Если везде Django и админка — не насилуйте рынок своим предпочтением: либо маленький Django-проект, либо ищите FastAPI-роли. Оба в skills без двух репозиториев путают.

Async: уметь сказать, зачем await на I/O и почему sync-драйвер БД в async-хендлере — ловушка. Не обязаны писать высоконагруженный event loop в первый месяц.

Порядок внутри фреймворка

  1. Маршруты, модели запроса/ответа, валидация, понятные 422.
  2. Слой сервиса: не класть SQL в каждый хендлер без границы, даже в учебке обозначьте функции.
  3. SQLAlchemy 2 или другой ORM — один. Сессия, транзакция, зависимость FastAPI.
  4. Alembic: ревизия, upgrade, как накатить в Docker.
  5. Аутентификация учебная: простые токены или basic с огромным предупреждением в README, что это не прод-SSO.
  6. Логирование и корреляция запроса — хотя бы request id в логе.
  7. Тесты: httpx/TestClient, отдельная БД или транзакции.

Фоновые задачи, Kafka, WebSocket — только если в вакансиях. Иначе честно «нет». OpenAPI — бонус из коробки, не главная строка резюме.

Структура репозитория, которая читается за минуту: app/ (api, schemas, models, services), tests/, alembic/, docker-compose.yml, .env.example. Не один main.py на 800 строк. Не обязательно чистая гексагональная архитектура. Достаточно, чтобы хендлер не содержал SQL-простыню и чтобы тест импортировал приложение без ручного «поправь PYTHONPATH».

Идемпотентность на пальцах: повторный POST с тем же ключом не создаёт второй заказ — или создаёт, и вы это честно написали. Для junior достаточно одного явного поведения и теста. Валидация дат и валют: не принимайте строку «завтра» туда, где нужен ISO. Pydantic это закроет, если схема жёсткая; не держите все поля Optional «чтобы прошло».

Документация /docs полезна вам и рекрутеру, но не заменяет README. Если swagger открывается, а миграции не описаны, человек не дойдёт до /docs. Добавьте пример curl на создание заказа. Это пять строк и сильный сигнал.

Зависимости: pin в requirements или uv/poetry lock. Не «latest FastAPI» каждый день. Версия Python в README совпадает с образом. Если используете asyncpg — не смешивайте со sync psycopg без решения. Выберите один путь и держитесь 90 дней.

SQL как навык: SQL roadmap. Контейнеры: Docker roadmap.

README, который открывают на отборе

Пятнадцать-двадцать строк:

  • что за сервис и какая сущность;
  • как поднять: compose, миграции, пример запроса;
  • стек и версии;
  • что сделано вами;
  • чего нет: оплаты, очереди, нормального auth;
  • как прогнать тесты.

Без этого swagger по localhost, который не стартует у рекрутера, бесполезен. Как описывать проект в файле резюме: как описать проекты, каркас: резюме Python-разработчика.

Пример 1. 90-дневный сервис заказов

  1. Дни 1–15. Модель заказа, POST/GET, валидация пустой корзины, Postgres, Alembic init.
  2. Дни 16–40. Список с фильтром статуса, пагинация, 404, зависимость сессии, два теста на POST.
  3. Дни 41–65. Compose, переменные, health. Учебный токен или пометка «auth нет, не для прода». Лог с id запроса.
  4. Дни 66–90. README, DECISIONS.md с одним отказом (почему не положили бизнес-правило в хендлер). Резюме, отклики, письмо.

Откликаюсь на junior Python backend (FastAPI). Сервис заказов: Pydantic-схемы, PostgreSQL, Alembic, тесты на создание и 422, Docker Compose. Коммерческого стажа нет. На созвоне разберу зависимость сессии и миграции. Репозиторий: [ссылка]. Готов к тестовому 4–8 часов в FastAPI или близком API.

Черновик: генератор письма. Не оставляйте «динамичный FastAPI-разработчик» без ссылки.

Пример 2. Туториал vs работа

Было. Скопирован официальный tutorial, SQLite, один файл, нет тестов, в skills: FastAPI, Flask, Django, asyncio, Kafka. На тестовом — пустой репозиторий или тот же tutorial.

Стало. Свой домен, миграции, тесты, compose, в skills FastAPI + Postgres + Docker. Flask/Django нет, если нет кода.

Второй вариант проходит скрининг. Первый узнают. Навыки backend: навыки backend-разработчика. Проверка резюме: cv-review.

Созвон и тестовое

Спросят: чем Depends полезен, как отдать 409, чем sync-сессия опасна в async, зачем Pydantic. Отвечайте на своём заказе. Общие Python-вопросы: вопросы на собеседовании Python, каркас: interview-prep.

Тестовое часто: «сделайте CRUD и тесты». Не начинайте в ночь ставить Kafka. Жанр: тестовое задание на работу.

Сессия БД, async и типичные дыры

Depends с сессией: открыли, отдали в хендлер, закрыли. Не прячьте глобальный engine-синглтон «на скорую руку» без понимания пула. Если хендлер async, а драйвер синхронный, вы блокируете цикл — на созвоне это спрашивают почти всегда, когда в резюме FastAPI и async рядом. Честный учебный путь: sync-хендлеры плюс sync SQLAlchemy, либо async-стек целиком. Смесь без комментария в README — красный флаг.

Валидация: Pydantic режет плохой вход, но бизнес-правило «нельзя оплатить отменённый заказ» живёт в сервисе и даёт 409, не 422. Смешивать это — частая ошибка туториала. Тест должен ловить оба случая. 404 на чужой id, 401 на учебном токене, если вы его вообще ввели.

Миграции в Docker: команда upgrade в README или в entrypoint с оговоркой, что на проде так делают осторожнее. Пароль БД только из окружения. Это стыкуется с Docker roadmap и не требует Kubernetes.

Как искать работу с одним API, не с пятью фреймворками

Заголовок: Python backend / FastAPI. Пули: сущности, миграции, тесты, compose. Не «Flask, Django, FastAPI, asyncio, Kafka». Письмо: ссылка, что умеет POST заказа, готовность к тестовому. Шаблон: сопроводительное без опыта. Файл: как составить резюме, проверка: cv-review.

Откликайтесь, где FastAPI или «Python API» в must-have. Django-only вакансии без вашего Django-кода — потеря времени или две недели на тонкий модуль, не строка в skills. Каталог: Python-вакансии, вход: junior. Если штат просит коммерческий стаж — стажировка. Тишина на пачку одинаковых писем: почему не отвечают.

Частые вопросы

FastAPI или Django на первую работу?

Что в ваших пяти вакансиях. Не рейтинг интернета. Если поровну — один проект до конца, второй не начинайте параллельно. Django в skills без админки и ORM-проекта — шум. FastAPI без миграций — туториал.

Нужен ли asyncio «глубоко»?

Понимание I/O и когда не блокировать цикл — да. Писать свой протокол — нет. Если в резюме async, будьте готовы объяснить sync-драйвер в async-хендлере. Если не готовы — уберите слово async из skills и оставьте рабочий sync-сервис.

SQLAlchemy 2 или raw SQL?

Для найма ORM плюс умение прочитать SQL. Raw рядом для отчёта — плюс. Только raw без схемы — тяжелее сопровождать учебный проект. На созвоне вас могут попросить показать SQL, который генерирует список заказов — держите EXPLAIN или просто текст запроса в README.

Стоит ли сразу TypeScript-фронт к FastAPI?

Нет, если цель backend. Swagger и httpx достаточны. Фронт размоет 90 дней. Если fullstack-вакансии — отдельное решение и другой объём, ближе к как стать fullstack, не к этой карте.

Как указать FastAPI, если делали только tutorial?

Не указывать как основной навык. Допилите свой домен или уберите. Созвон вскроет. Скопированный tutorial узнают по структуре папок и по «hero» из документации.

Английский?

Документация FastAPI на английском. Созвон — по вакансии. Не блокируйте сервис ожиданием C1. Чтение ошибок Pydantic и SQLAlchemy — уже рабочий минимум.

Что сделать сейчас

Создайте сервис с одной сущностью и миграциями, не «ещё один hello world». Добавьте два теста и compose. Напишите, чего в проекте нет. Соберите резюме под Python backend и откликайтесь туда, где FastAPI или «Python API» совпадает со стеком — смотреть объявления удобно в каталоге Python-вакансий.

Roadmap фреймворка без запускаемого контура — конспект декораторов. Работа начинается, когда рекрутер поднимает ваш API и задаёт вопрос по коду заказа, а не по swagger из туториала.

Ближайшие две недели: POST/GET одной сущности, Pydantic-схема, 422 на пустое тело, Postgres, одна ревизия Alembic, два теста, compose. Не подключайте Redis, Celery и JWT «как в большом шаблоне с GitHub». Шаблон на 40 папок без вашего домена слабее короткого сервиса заказов. Если шаблон уже скачан — вырежьте всё, чего не можете объяснить на созвоне за минуту, включая скрытые очереди. Лучше короткий сервис, который вы защищаете, чем чужой монолит с непрочитанным README. На отборе спрашивают ваш код заказа, не чужие абстракции из шаблона и не swagger из документации FastAPI. Если не можете провести по файлам без подсказки — вырежьте шаблон ещё раз и оставьте одну сущность заказа без лишнего шаблонного кода.

На третьей-четвёртой неделе добавьте фильтр списка и 404. На пятой — health и пример curl в README. На шестой — разбор в DECISIONS, почему бизнес-правило не в хендлере. Дальше — резюме и отклики на Python-вакансии, где FastAPI или API на Python в тексте.

Если тестовое дадут на Flask или «чистом» Starlette, не спорьте про FastAPI. Перенесите те же идеи: схема входа, статус-код, сессия БД, тест. Фреймворк — деталь. Навык — сервис, который можно сломать тестом и починить.

Ещё один рабочий критерий готовности: вы за 8 минут рассказываете, как создаётся заказ, где валидация, где правило статуса, как накатить миграцию и что будет при повторном POST. Если рассказ срывается на «это в туториале» — ещё рано слать пачку. Допишите DECISIONS и тест на 409. Затем проверка резюме и точечные отклики, не рассылка на все Python-роли подряд.

Откликаюсь на junior Python (FastAPI). Сервис заказов: схемы Pydantic, Postgres, Alembic, тесты на 422 и создание, Docker Compose, curl в README. Коммерческого стажа нет. На созвоне разберу сессию БД и правило статуса. Репозиторий: [ссылка]. Готов к тестовому API на 4–8 часов в FastAPI или близком стеке, без очередей «на всякий случай».