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 в первый месяц.
Порядок внутри фреймворка
- Маршруты, модели запроса/ответа, валидация, понятные 422.
- Слой сервиса: не класть SQL в каждый хендлер без границы, даже в учебке обозначьте функции.
- SQLAlchemy 2 или другой ORM — один. Сессия, транзакция, зависимость FastAPI.
- Alembic: ревизия, upgrade, как накатить в Docker.
- Аутентификация учебная: простые токены или basic с огромным предупреждением в README, что это не прод-SSO.
- Логирование и корреляция запроса — хотя бы request id в логе.
- Тесты: 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–15. Модель заказа, POST/GET, валидация пустой корзины, Postgres, Alembic init.
- Дни 16–40. Список с фильтром статуса, пагинация, 404, зависимость сессии, два теста на POST.
- Дни 41–65. Compose, переменные, health. Учебный токен или пометка «auth нет, не для прода». Лог с id запроса.
- Дни 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 или близком стеке, без очередей «на всякий случай».