FastAPI – асинхронный фреймворк для API

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Введение в 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:

bash
pip install fastapi[all]

Создание файла main.py:

python
from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"message": "FastAPI работает"}

Запуск приложения:

bash
uvicorn main:app --reload

Первый пример API на FastAPI

python
from fastapi import FastAPI app = FastAPI() @app.get("/items/{item_id}") def read_item(item_id: int, q: str = None): return {"item_id": item_id, "q": q}

FastAPI автоматически преобразует параметры и возвращает JSON-ответ.


Обработка запросов: GET, POST, PUT, DELETE

python
from fastapi import Body @app.post("/items/") def create_item(name: str = Body(...), price: float = Body(...)): return {"name": name, "price": price} @app.put("/items/{item_id}") def update_item(item_id: int, name: str): return {"item_id": item_id, "new_name": name} @app.delete("/items/{item_id}") def delete_item(item_id: int): return {"deleted": item_id}

Работа с параметрами, телом запроса и заголовками

FastAPI позволяет использовать:

  • Path-параметры (/item/{id})

  • Query-параметры (?name=abc)

  • Body-параметры (через Body)

  • Заголовки (через Header)

  • Cookies (через Cookie)

python
from fastapi import Header @app.get("/header/") def get_header(user_agent: str = Header(...)): return {"User-Agent": user_agent}

Асинхронность в FastAPI

FastAPI полностью поддерживает async def:

python
import asyncio @app.get("/async/") async def async_endpoint(): await asyncio.sleep(1) return {"message": "Асинхронный ответ"}

Валидация данных с Pydantic

Модель запроса с Pydantic:

python
from pydantic import BaseModel class Item(BaseModel): name: str price: float in_stock: bool = True @app.post("/items/") def create_item(item: Item): return item

FastAPI автоматически проверит типы и вернёт ошибку 422, если данные некорректны.


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

Документация доступна по умолчанию:

  • Swagger UI: http://localhost:8000/docs

  • ReDoc: http://localhost:8000/redoc

Также можно отключить или кастомизировать документацию.


Работа с базой данных (SQLAlchemy, asyncpg)

Подключение к PostgreSQL через SQLAlchemy:

bash
pip install sqlalchemy asyncpg databases

Пример подключения:

python
from sqlalchemy import create_engine, MetaData DATABASE_URL = "postgresql+asyncpg://user:password@localhost/db"

FastAPI работает с ORM, а также с асинхронными библиотеками, такими как databases.


Организация структуры крупного проекта

Рекомендуемая структура:

pgsql
project/ │ ├── main.py ├── routers/ │ ├── users.py │ └── items.py ├── models/ ├── database.py ├── schemas.py └── auth/

Используется APIRouter для модульного разделения маршрутов.


Подключение middlewares и CORS

python
from fastapi.middleware.cors import CORSMiddleware app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], )

Поддерживаются любые WSGI/ASGI совместимые middleware.


Аутентификация и авторизация (OAuth2, JWT)

FastAPI поддерживает:

  • OAuth2 Password Flow

  • JWT-токены

  • Dependency Injection для проверки пользователя

Пример:

python
from fastapi.security import OAuth2PasswordBearer oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") @app.get("/secure/") def secure_route(token: str = Depends(oauth2_scheme)): return {"token": token}

Тестирование API

Тестирование с TestClient:

python
from fastapi.testclient import TestClient client = TestClient(app) def test_read_main(): response = client.get("/") assert response.status_code == 200 assert response.json() == {"message": "FastAPI работает"}

Также поддерживается Pytest, unittest, HTTPX.


Развёртывание FastAPI-приложения

Способы:

  • Uvicorn: локальный сервер

  • Gunicorn + Uvicorn workers: продакшн

  • Docker: контейнеризация

  • FastAPI + Nginx: масштабируемость

  • Heroku / Render / Railway / AWS Lambda

Пример запуска:

bash
gunicorn main:app -k uvicorn.workers.UvicornWorker

Примеры практического применения 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(...) Явное указание параметров (валидация, описание).
python
from fastapi import Query @app.get("/items/") def read_items(q: str = Query(..., min_length=3)): return {"q": q}

Тело запроса и Pydantic-модели

Компонент Описание
BaseModel Класс модели данных для тела запроса.
@app.post() + def func(item: Model) Автоматическая валидация JSON-данных.
.dict(), .json() Преобразование Pydantic-модели.
Field(...) Метаданные для полей модели.
python
from pydantic import BaseModel, Field class Item(BaseModel): name: str price: float = Field(..., gt=0) @app.post("/items/") def create_item(item: Item): return item

Ответы и статус-коды

Компонент Описание
Response, JSONResponse Возвращает произвольные ответы.
status.HTTP_201_CREATED Стандартизированные HTTP-статусы.
response_model=Model Автоматическое сериализованное тело ответа.
@app.get(..., response_model=...) Преобразование ответа к модели.
python
from fastapi import status from fastapi.responses import JSONResponse @app.post("/items/", status_code=status.HTTP_201_CREATED) def create_item(...): return JSONResponse(content={"msg": "OK"})

Валидация и зависимости

Компонент Описание
Depends() Внедрение зависимостей.
Header, Cookie Извлечение HTTP-заголовков и куков.
Security(...) Используется с OAuth2 и авторизацией.
python
from fastapi import Depends def get_token_header(token: str = Header(...)): return token @app.get("/secure/", dependencies=[Depends(get_token_header)]) def secure(): return {"secure": True}

Обработка ошибок

Компонент Описание
HTTPException(status_code, detail) Возбуждение ошибки с кодом и сообщением.
@app.exception_handler(Exception) Пользовательская обработка ошибок.
RequestValidationError Обработка ошибок валидации входных данных.

Фоновая обработка

Компонент Описание
BackgroundTasks Планирует фоновую задачу после ответа клиенту.
python
from fastapi import BackgroundTasks def write_log(msg: str): ... @app.post("/log/") def log(message: str, background_tasks: BackgroundTasks): background_tasks.add_task(write_log, message) return {"status": "logged"}

Маршруты и модули

Компонент Описание
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-запросов в тестах.