Введение в FastAPI
FastAPI — это современный веб-фреймворк на Python, предназначенный для быстрого создания RESTful API. Он основан на стандартах OpenAPI и JSON Schema, полностью поддерживает асинхронное программирование, предоставляет встроенную валидацию данных и автоматически генерирует документацию. FastAPI идеально подходит для микросервисов, машинного обучения и высоконагруженных API.
Особенности и преимущества FastAPI
-
Высокая производительность (на уровне Node.js и Go)
-
Полная поддержка асинхронности (async/await)
-
Автоматическая генерация документации Swagger и ReDoc
-
Поддержка Pydantic для валидации и сериализации данных
-
Поддержка типизации Python 3.7+ с автокомплитом в IDE
-
Простота интеграции с базами данных, OAuth2, JWT, CORS
Установка и настройка проекта
Установка FastAPI и сервера Uvicorn:
Создание файла main.py
:
Запуск приложения:
Первый пример API на FastAPI
FastAPI автоматически преобразует параметры и возвращает JSON-ответ.
Обработка запросов: GET, POST, PUT, DELETE
Работа с параметрами, телом запроса и заголовками
FastAPI позволяет использовать:
-
Path-параметры (
/item/{id}
) -
Query-параметры (
?name=abc
) -
Body-параметры (через
Body
) -
Заголовки (через
Header
) -
Cookies (через
Cookie
)
Асинхронность в FastAPI
FastAPI полностью поддерживает async def
:
Валидация данных с Pydantic
Модель запроса с Pydantic:
FastAPI автоматически проверит типы и вернёт ошибку 422, если данные некорректны.
Автоматическая документация Swagger и ReDoc
Документация доступна по умолчанию:
-
Swagger UI:
http://localhost:8000/docs
-
ReDoc:
http://localhost:8000/redoc
Также можно отключить или кастомизировать документацию.
Работа с базой данных (SQLAlchemy, asyncpg)
Подключение к PostgreSQL через SQLAlchemy:
Пример подключения:
FastAPI работает с ORM, а также с асинхронными библиотеками, такими как databases
.
Организация структуры крупного проекта
Рекомендуемая структура:
Используется APIRouter
для модульного разделения маршрутов.
Подключение middlewares и CORS
Поддерживаются любые WSGI/ASGI совместимые middleware.
Аутентификация и авторизация (OAuth2, JWT)
FastAPI поддерживает:
-
OAuth2 Password Flow
-
JWT-токены
-
Dependency Injection для проверки пользователя
Пример:
Тестирование API
Тестирование с TestClient
:
Также поддерживается Pytest, unittest, HTTPX.
Развёртывание FastAPI-приложения
Способы:
-
Uvicorn: локальный сервер
-
Gunicorn + Uvicorn workers: продакшн
-
Docker: контейнеризация
-
FastAPI + Nginx: масштабируемость
-
Heroku / Render / Railway / AWS Lambda
Пример запуска:
Примеры практического применения FastAPI
-
Высоконагруженные микросервисы
-
Бэкенд чат-ботов и AI-систем
-
REST API для мобильных приложений
-
ML/DS модели в виде API
-
Реактивные системы и WebSocket-приложения
-
Легковесные админки и внутренние сервисы
Часто задаваемые вопросы
Что такое FastAPI?
Асинхронный фреймворк для разработки REST и GraphQL API на Python.
Чем FastAPI отличается от Flask?
FastAPI современнее, поддерживает типизацию, асинхронность, автогенерацию документации и масштабируемость.
Поддерживает ли FastAPI WebSocket?
Да, через @app.websocket()
.
Можно ли использовать базы данных?
Да, с SQLAlchemy, Tortoise ORM, GINO, asyncpg и другими.
Можно ли использовать FastAPI с Docker?
Да, FastAPI отлично интегрируется с Docker и CI/CD пайплайнами.
Полный справочник по ключевым функциям и модулям библиотеки FastAPI для Python
Основы создания приложения
Компонент | Описание |
---|---|
FastAPI() |
Создает экземпляр приложения. |
@app.get("/path") |
Декоратор для GET-обработчика. |
@app.post("/path") |
Декоратор для POST-обработчика. |
@app.put("/path") , @app.delete("/path") |
Поддержка других HTTP-методов. |
uvicorn main:app --reload |
Запуск сервера с автоматической перезагрузкой. |
Обработка параметров запроса
Тип параметра | Описание |
---|---|
@app.get("/items/{item_id}") |
Путь с параметром (item_id доступен в функции). |
def func(q: str = None) |
Query-параметры (например, ?q=текст ). |
def func(skip: int = 0) |
Параметры с значениями по умолчанию. |
Path(...) , Query(...) |
Явное указание параметров (валидация, описание). |
Тело запроса и Pydantic-модели
Компонент | Описание |
---|---|
BaseModel |
Класс модели данных для тела запроса. |
@app.post() + def func(item: Model) |
Автоматическая валидация JSON-данных. |
.dict() , .json() |
Преобразование Pydantic-модели. |
Field(...) |
Метаданные для полей модели. |
Ответы и статус-коды
Компонент | Описание |
---|---|
Response , JSONResponse |
Возвращает произвольные ответы. |
status.HTTP_201_CREATED |
Стандартизированные HTTP-статусы. |
response_model=Model |
Автоматическое сериализованное тело ответа. |
@app.get(..., response_model=...) |
Преобразование ответа к модели. |
Валидация и зависимости
Компонент | Описание |
---|---|
Depends() |
Внедрение зависимостей. |
Header , Cookie |
Извлечение HTTP-заголовков и куков. |
Security(...) |
Используется с OAuth2 и авторизацией. |
Обработка ошибок
Компонент | Описание |
---|---|
HTTPException(status_code, detail) |
Возбуждение ошибки с кодом и сообщением. |
@app.exception_handler(Exception) |
Пользовательская обработка ошибок. |
RequestValidationError |
Обработка ошибок валидации входных данных. |
Фоновая обработка
Компонент | Описание |
---|---|
BackgroundTasks |
Планирует фоновую задачу после ответа клиенту. |
Маршруты и модули
Компонент | Описание |
---|---|
APIRouter() |
Создание модуля маршрутов. |
@router.get() |
Использование маршрутов в модуле. |
app.include_router(router) |
Подключение маршрутов к приложению. |
Автоматическая документация
URL | Описание |
---|---|
/docs |
Swagger UI (интерактивная документация по умолчанию). |
/redoc |
Альтернативный интерфейс ReDoc. |
openapi.json |
JSON-описание API (OpenAPI-спецификация). |
Поддержка WebSocket и событий
Компонент | Описание |
---|---|
@app.websocket("/ws") |
Обработка WebSocket-подключений. |
@app.on_event("startup") |
Код, выполняющийся при запуске. |
@app.on_event("shutdown") |
Код, выполняющийся при завершении работы. |
Тестирование
Инструмент | Описание |
---|---|
TestClient(app) |
Из модуля fastapi.testclient , основан на requests . |
client.get/post(...) |
Имитация HTTP-запросов в тестах. |