FastAPI за последние годы стал одним из самых быстрорастущих веб-фреймворков в экосистеме Python, и это совершенно не случайно. Он объединяет в одном инструменте асинхронное программирование, современные аннотации типов Python и автоматическую генерацию документации, что позволяет разработчикам создавать одновременно удобные и чрезвычайно производительные API. Если вы пишете REST API на Python и ищете современную альтернативу Flask или Django, FastAPI почти всегда оказывается оптимальным выбором. В этой статье мы подробно рассмотрим его ключевые идеи, практические примеры кода и отличия от других фреймворков.
Что такое FastAPI и почему он популярен
FastAPI — это современный высокопроизводительный веб-фреймворк для Python версии 3.7 и выше, построенный поверх библиотек Starlette (для веб-слоя) и Pydantic (для валидации данных). Его главное преимущество — скорость: FastAPI работает на уровне, сравнимом с Node.js и Go, поскольку полностью использует механизм async/await и обрабатывает запросы параллельно, не блокируя поток. Кроме того, фреймворк значительно сокращает время написания кода, так как множество рутинных задач выполняется автоматически благодаря системе типов.
Вторая причина популярности — автоматическая документация. После того как вы описали свои эндпоинты, FastAPI самостоятельно создаёт интерактивную документацию в форматах Swagger UI и ReDoc. Это означает, что вам не нужно писать отдельную документацию для вашего API — разработчики могут прямо в браузере тестировать запросы и видеть структуру данных. Валидация на основе аннотаций типов автоматически проверяет входящие данные и при ошибке возвращает понятное сообщение с указанием проблемного поля.
Создание первого API
Чтобы начать работу с FastAPI, сначала установим необходимые пакеты. Выполните в терминале следующую команду, которая установит сам FastAPI и сервер Uvicorn для запуска приложения. После этого мы напишем первую версию программы в одном файле, чтобы увидеть базовую структуру.
pip install fastapi uvicorn
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Привет, FastAPI!"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str | None = None):
return {"item_id": item_id, "q": q}
В этой небольшой программе мы создали два эндпоинта. Первый возвращает простое сообщение при GET-запросе на корневой адрес, а второй принимает параметр пути item_id и необязательный параметр запроса q. Обратите внимание, что для item_id указан тип int — это указывает FastAPI автоматически преобразовать входящее значение в целое число и вернуть ошибку, если пришли некорректные данные. Чтобы запустить приложение, выполните в терминале команду uvicorn main:app --reload, и сервер будет автоматически перезагружаться при изменении кода.
Валидация с помощью моделей Pydantic
Одна из самых сильных сторон FastAPI — возможность описывать и проверять сложные структуры данных с помощью моделей Pydantic. Вы создаёте модель как обычный класс Python и указываете тип каждого поля, а FastAPI автоматически приводит входящие данные JSON к этой модели. Если данные не соответствуют ожидаемой структуре, фреймворк возвращает подробное сообщение об ошибке с указанием конкретного поля и причины.
from pydantic import BaseModel
from fastapi import FastAPI
app = FastAPI()
class User(BaseModel):
name: str
email: str
age: int | None = None
@app.post("/users/")
def create_user(user: User):
return {"created": user.name, "email": user.email}
В этом примере модель User состоит из трёх полей: name и email обязательны, а age является необязательным. Когда приходит POST-запрос, FastAPI автоматически преобразует тело JSON в объект User и проверяет все поля на соответствие типам. Такой подход делает код намного безопаснее и удобнее для чтения, поскольку гарантирует, что данные всегда будут приходить в ожидаемом формате, а не где-то глубоко в логике приложения.
Асинхронность и автоматическая документация OpenAPI
FastAPI имеет полную поддержку асинхронности: вы можете писать функции эндпоинтов с async def и выполнять запросы к базе данных или внешним API без блокировки потока. Это особенно важно для высоконагруженных систем, обрабатывающих множество запросов одновременно, поскольку ресурсы сервера используются эффективно. Внутри асинхронной функции с помощью ключевого слова await вы можете ожидать завершения других асинхронных операций, не останавливая обработку остальных запросов.
Автоматическая документация OpenAPI открывается по адресу /docs в виде интерфейса Swagger UI сразу после запуска проекта. Там отображаются все эндпоинты, их параметры и ожидаемые ответы, а также есть возможность отправлять тестовые запросы прямо из браузера. По адресу /redoc доступна альтернативная документация в формате ReDoc. Эта возможность оказывается бесценной при командной работе и при передаче API другим разработчикам, так как документация всегда актуальна.
Отличия от Flask и Django и когда выбирать
Flask очень лёгкий и гибкий, однако он работает синхронно и требует дополнительных библиотек для валидации и документации. Django — это полнофункциональный фреймворк с множеством готовых компонентов, таких как админ-панель и ORM, но он может оказаться слишком тяжёлым для чисто API-проектов. FastAPI находит баланс между этими двумя мирами: он лёгкий, но при этом включает современную валидацию и автоматическую генерацию документации из коробки, без дополнительных настроек.
Выбор FastAPI оправдан в случаях, когда требуется высокая производительность API, при построении микросервисной архитектуры, для предоставления моделей машинного обучения в виде сервиса и для приложений реального времени. Если же вам нужен полноценный веб-сайт с админ-панелью и шаблонной системой, Django по-прежнему может быть хорошим выбором. Но если ваша цель — создать современный, быстрый и хорошо документированный API, FastAPI оказывается практически вне конкуренции. Его легко изучить, и он помогает быстрее вывести продукт на рынок.