Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Введение в FastAPI
intro

Введение в FastAPI

Зачем нужен FastAPI, сравнение с Flask и Django REST Framework, установка и первые шаги

Введение в FastAPI

FastAPI — современный веб-фреймворк для Python, использующий аннотации типов для валидации, документации и внедрения зависимостей. В этой теме вы поймёте, чем FastAPI отличается от альтернатив и когда его стоит выбирать.

#Почему FastAPI?

Представьте, что вы создаёте API. Вам нужно:

  • Принимать JSON от клиента
  • Проверять, что все поля на месте и имеют правильный тип
  • Вернуть ответ в нужном формате
  • Написать документацию, чтобы другие разработчики поняли, как использовать ваш API
  • Обеспечить достаточную производительность

Раньше это означало много шаблонного кода. FastAPI меняет подход.

#Что делает FastAPI особенным?

1. Автоматическая валидация данных

Вместо ручных проверок if 'email' not in data вы объявляете типы, а FastAPI и Pydantic проверяют входные данные во время выполнения:

from pydantic import BaseModel class UserCreate(BaseModel): email: str # Обязательно строка age: int # Обязательно целое число @app.post('/users') def create_user(user: UserCreate): # user.email и user.age уже гарантированно правильных типов return {'id': 1, **user.model_dump()}

Если клиент отправит {"email": 123}, FastAPI автоматически вернёт ошибку 422 с подробным описанием проблемы.

2. Автоматическая документация

FastAPI генерирует интерактивную OpenAPI-документацию из ваших аннотаций типов:

@app.get('/users/{user_id}', response_model=UserResponse) def get_user(user_id: int): """Получить пользователя по ID""" ...

Откройте /docs в браузере — и у вас готовый Swagger UI с возможностью тестирования API.

3. Асинхронность на основе ASGI

FastAPI построен на Starlette (асинхронный веб-фреймворк) и Pydantic (валидация данных). Благодаря поддержке async/await и ASGI, FastAPI подходит для большого количества I/O-операций, WebSocket, SSE и долгоживущих соединений.

4. Интуитивный синтаксис

from fastapi import FastAPI app = FastAPI() @app.get('/') def read_root(): return {'Hello': 'World'}

Это весь код для создания работающего API.

#Типизация в FastAPI

Python остаётся динамически типизированным языком — сам интерпретатор не обеспечивает соблюдение аннотаций. FastAPI активно использует аннотации типов Python: на их основе FastAPI и Pydantic выполняют обработку и валидацию данных во время выполнения, а внешние анализаторы (Pyright, mypy, IDE) могут проверять код статически.

FlaskFastAPI
Аннотации типов необязательны и обычно не определяют поведение фреймворкаАннотации являются важной частью объявления API, валидации и документации

#Сравнение с альтернативами

#FastAPI vs Flask

КритерийFlaskFastAPI
ВалидацияРучная или через расширения (marshmallow, Pydantic)Встроенная через Pydantic
ДокументацияТребует расширений (flask-openapi, connexion)Автоматическая OpenAPI
АсинхронностьОграниченная (Flask 2.0+)Полноценная async/await через ASGI
ТипизацияАннотации необязательныАннотации — основа API, валидации и документации

Когда Flask:

  • Небольшое приложение со зрелой Flask-экосистемой
  • Команда не работает с async/await

Когда FastAPI:

  • Новый типизированный API, OpenAPI, async-интеграции
  • Нужны WebSocket, SSE, большое число I/O-операций

#FastAPI vs Django REST Framework

КритерийDRFFastAPI
ЭкосистемаПолная (ORM, админка, аутентификация)Минимальная (только API)
СложностьВысокая, много абстракцийНизкая, явный код
АсинхронностьОграниченнаяПолноценная async/await

Когда DRF:

  • Уже есть Django, ORM, admin и модель пользователей
  • Основная сложность — бизнес-модель и admin-интерфейс

Когда FastAPI:

  • Новый типизированный API с async-интеграциями
  • Микросервис или модульный монолит

#Выбор стека по ситуации

СитуацияОбычно рациональный выбор
Уже есть Django, ORM, admin и модель пользователейDjango REST Framework
Небольшое приложение со зрелой Flask-экосистемойFlask
Новый типизированный API, OpenAPI, async-интеграцииFastAPI
Основная сложность — бизнес-модель и admin-интерфейсDjango/DRF
Нужны WebSocket, SSE, большое число I/O-операцийASGI-фреймворк (FastAPI и др.)

#Установка FastAPI

#Шаг 1: Создайте виртуальное окружение

python -m venv .venv source .venv/bin/activate # Linux/macOS # или .venv\Scripts\activate # Windows

#Шаг 2: Установите FastAPI

Актуальный способ из официальной документации:

python -m pip install "fastapi[standard]"

fastapi[standard] включает Uvicorn с дополнительными зависимостями (uvloop, httptools, watchfiles, websockets).

#Шаг 3: Запуск в разработке

fastapi dev main.py

FastAPI CLI запускает приложение через ASGI-сервер (Uvicorn) с автоперезагрузкой.

Для production:

fastapi run main.py

#Альтернатива: прямой запуск через Uvicorn

uvicorn main:app --reload
  • main — имя файла (main.py)
  • app — переменная с приложением
  • --reload — автоперезагрузка при изменениях

Оба способа запускают одно и то же ASGI-приложение. FastAPI CLI — рекомендуемый путь в актуальной документации.

#Шаг 4: Проверьте установку

python -c "import fastapi; print(fastapi.__version__)"

Откройте http://localhost:8000/docs — и вы увидите готовую документацию!

#Что такое ASGI?

ASGI (Asynchronous Server Gateway Interface) — спецификация, которая поддерживает асинхронный обмен сообщениями между сервером и приложением.

До ASGI был WSGI (Web Server Gateway Interface) — синхронный интерфейс приложения. WSGI не означает, что запросы всегда выполняются строго один за другим: сервер может обрабатывать их конкурентно через несколько процессов, потоков или специальные worker-модели. Но WSGI задаёт синхронный интерфейс самого приложения, что ограничивает работу с долгоживущими соединениями и WebSocket.

ASGI подходит для:

  • Большого количества I/O-операций
  • WebSocket и SSE
  • Долгоживущих соединений

async даёт конкурентность во время ожидания сети или базы данных, но не превращает CPU-bound Python-код в параллельный. Для использования нескольких ядер процессора нужны несколько workers.

#Когда писать def, а когда async def

СитуацияРекомендация
Используемые библиотеки предоставляют асинхронный APIasync def
Вызывается синхронный кодобычный def (FastAPI выполнит в пуле потоков)
Нужно вызвать блокирующий клиент (например requests) внутри async defВынести работу в отдельный поток или использовать асинхронный клиент (httpx)
Нужно использовать несколько ядер процессораЗапустить несколько workers

Нельзя вызывать блокирующий код вроде requests.get(...) внутри async def без вынесения работы — это заблокирует event loop для всех остальных запросов.

#Архитектура FastAPI

FastAPI состоит из трёх ключевых компонентов:

┌─────────────────────────────────────────┐
│              FastAPI App                │
│  ┌─────────────┐  ┌─────────────────┐   │
│  │   Starlette │  │     Pydantic    │   │
│  │  (роутинг,  │  │ (валидация,     │   │
│  │ middleware, │  │  сериализация)  │   │
│  │ WebSocket)  │  │                 │   │
│  └─────────────┘  └─────────────────┘   │
└─────────────────────────────────────────┘
                    ↓
              ┌───────────┐
              │  Uvicorn  │
              │  (ASGI    │
              │  сервер)  │
              └───────────┘
  • Starlette — отвечает за маршрутизацию, middleware, WebSocket, запросы/ответы
  • Pydantic — валидация данных, сериализация JSON, работа с типами
  • Uvicorn — ASGI-сервер, запускает приложение и обрабатывает соединения

#Практическая лабораторная: производительность

Вместо готовых цифр производительности проведите собственный эксперимент. Создайте четыре эндпоинта:

  1. Пустой эндпоинт (просто return {"ok": True})
  2. Эндпоинт с Pydantic-моделью (валидация и сериализация)
  3. Эндпоинт с искусственным I/O-ожиданием (asyncio.sleep)
  4. Эндпоинт с CPU-bound вычислением (например, вычисление чисел Фибоначчи)

Запустите бенчмарк (например, wrk или hey) с одним и несколькими workers.

Вопросы для анализа:

  • Почему результаты отличаются?
  • Помогает ли async def для CPU-bound задачи?
  • Что меняется при увеличении числа workers?

Этот эксперимент одновременно обучает FastAPI, асинхронности и корректному чтению бенчмарков.

#Ваш первый взгляд на код FastAPI

Вот полный пример минимального API:

from fastapi import FastAPI app = FastAPI( title="My API", description="Моё первое API", version="1.0.0" ) @app.get('/') def read_root(): return {'message': 'Hello, World!'} @app.get('/items/{item_id}') def read_item(item_id: int, q: str | None = None): return {'item_id': item_id, 'q': q}

Запуск:

fastapi dev main.py

#Ресурсы

  • Официальная документация FastAPI
  • GitHub репозиторий
  • Pydantic документация
  • Starlette документация

Далее: Первые шаги