FastAPI прочно занял место одного из лидеров среди Python-фреймворков. По состоянию на начало 2026 года, его популярность продолжает расти: согласно опросам JetBrains и Python Software Foundation, 38% профессиональных Python-разработчиков используют FastAPI, что на 9% больше, чем в 2023 году . Количество звезд на GitHub превысило 91.7 тысяч, а ежемесячные загрузки на PyPI достигли уровня Django — около 9 миллионов .
Но важен не только рост сообщества. В последних релизах (версии 0.128.0 → 0.135.0) появились критические изменения и мощные функции, которые делают разработку еще быстрее и удобнее. В этой статье мы рассмотрим главные нововведения, обсудим, что планируется дальше, и, конечно, закрепим знания примерами кода.
1. Что нового в последних релизах (2025–2026)
Разработка FastAPI не стоит на месте. Команда во главе с Sebastián Ramírez (tiangolo) активно внедряет изменения, повышающие производительность и удобство разработки.
🚀 Ускорение JSON в 2 раза (Pydantic на Rust)
Версия: 0.130.0
Фича: Сериализация JSON с помощью Pydantic (на Rust) .
Это, пожалуй, самое громкое улучшение производительности за последнее время. Когда вы возвращаете ответ с Pydantic-моделью, FastAPI теперь использует внутренности Pydantic V2, написанные на Rust (pydantic-core). Это дает двукратный (или более) прирост производительности по сравнению со стандартной JSON-сериализацией Python.
Внимание!
Вам не нужно ничего менять в коде, чтобы воспользоваться ускорением. Оно работает "под капотом" автоматически, если вы используете Pydantic модели для ответа.
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
@app.get("/items/{item_id}", response_model=Item)
async def read_item(item_id: int):
# FastAPI теперь использует pydantic-core (Rust) для сериализации этого ответа
return Item(name="Coffee Maker", price=49.99)
📤 Стриминг данных (JSON Lines и бинарные данные) через yield
Версия: 0.134.0
Фича: Поддержка стриминга JSON Lines и бинарных данных с помощью yield .
Раньше для стриминга нужно было вручную работать со StreamingResponse. Теперь можно использовать генераторы с yield прямо в функциях пути. Это позволяет отправлять клиенту данные чанками (порциями) по мере их генерации. Функциональность требует Starlette 0.46.0+.
Пример стриминга JSON Lines (application/x-ndjson):
Представьте, что вам нужно отдать 1000 записей, не загружая их все в память сразу.
from fastapi import FastAPI
from pydantic import BaseModel
import asyncio
app = FastAPI()
class Item(BaseModel):
id: int
name: str
@app.get("/stream-items")
async def stream_items():
# Этот генератор будет отдавать данные по одной модели за раз
async def generate():
for i in range(1000):
# Имитация долгой операции получения данных из БД или другого API
await asyncio.sleep(0.01)
yield Item(id=i, name=f"Item-{i}").model_dump_json()
# Важно! Каждый элемент должен быть на отдельной строке (JSON Lines)
yield "\n"
return StreamingResponse(generate(), media_type="application/x-ndjson")
Новая документация: Stream JSON Lines .
🗑️ Деприкация ORJSONResponse и UJSONResponse
Версия: 0.131.0
Изменение: Классы ORJSONResponse и UJSONResponse объявлены устаревшими (deprecated) .
Причина: Встроенная сериализация на базе Pydantic (Rust) теперь работает быстрее, чем orjson, и является стандартом. Разработчики хотят упростить стек и продвигать использование стандартного JSONResponse, который теперь "под капотом" использует быстрый Pydantic.
Что делать: Перестаньте явно использовать ORJSONResponse. Просто полагайтесь на стандартный механизм сериализации.
Было (раньше):
from fastapi.responses import ORJSONResponse
@app.get("/items", response_class=ORJSONResponse)
async def get_items():
return [{"item": "Foo"}]
Стало (сейчас):
from fastapi.responses import JSONResponse
@app.get("/items", response_class=JSONResponse) # Или вообще опустить response_class
async def get_items():
return [{"item": "Foo"}]
🔧 Улучшения для разработчиков (0.128.x - 0.129.x)
- Четкая ошибка при рекурсивном подключении роутера: Если вы случайно попытаетесь подключить APIRouter сам к себе, FastAPI покажет понятное сообщение об ошибке, а не зациклится .
- Исправление JSON Schema для bytes: Для полей типа bytes теперь корректно генерируется схема OpenAPI с "contentMediaType": "application/octet-stream" вместо "format": "binary", что более точно соответствует спецификации .
- Конец эры fastapi-slim: Поддержка отдельного пакета fastapi-slim прекращена. Вместо него рекомендуется использовать fastapi[standard] или просто fastapi .
2. Тренды и планируемое развитие в 2026
Заглядывая в будущее, можно выделить несколько направлений, в которых движется не только сам фреймворк, но и экосистема вокруг него.
🤖 FastAPI как стандарт для ML и AI
FastAPI стал де-факто стандартом для развертывания моделей машинного обучения . Это связано с его асинхронностью (хорошо для долгих инференсов), простой интеграцией с библиотеками вроде PyTorch/TensorFlow и автоматической документацией, которую могут потреблять другие сервисы.
Пример инференса ML-модели:
from fastapi import FastAPI
from pydantic import BaseModel
import asyncio
import numpy as np
# Предположим, у вас есть загруженная модель
# model = load_my_model()
app = FastAPI()
class PredictionRequest(BaseModel):
data: list[float]
class PredictionResponse(BaseModel):
prediction: float
processing_time: float
@app.post("/predict", response_model=PredictionResponse)
async def predict(request: PredictionRequest):
start = asyncio.get_event_loop().time()
# Имитация работы модели (CPU-bound операцию лучше выполнять в thread pool)
# Для реальных случаев используйте asyncio.to_thread(model.predict, request.data)
await asyncio.sleep(0.05) # Имитация инференса
result = sum(request.data) / len(request.data) if request.data else 0.0
processing_time = asyncio.get_event_loop().time() - start
return PredictionResponse(prediction=result, processing_time=processing_time)
📁 File-based routing (Экосистема)
Хотя в самом FastAPI этого пока нет, сообщество активно движется к упрощению структуры проекта. Появились библиотеки, такие как fastapi-filebased-routing, которые реализуют маршрутизацию на основе файлов, вдохновленную Next.js .
Как это выглядит сейчас (благодаря сторонним библиотекам):
Структура папок app/:
app/
├── users/
│ └── route.py # -> GET /users, POST /users
│ └── [id]/
│ └── route.py # -> GET /users/123
└── items/
└── route.py # -> GET /items
Пример содержимого app/users/[id]/route.py:
from fastapi_filebased_routing import route
# GET /users/{user_id}
class get(route):
async def handler(user_id: str):
return {"user_id": user_id, "name": f"User {user_id}"}
🛡️ Безопасность и наблюдаемость
С ростом продакшн-нагрузок растут и требования к безопасности. Недавно была обнаружена уязвимость CVE-2026-23996 (timing side-channel в библиотеке API Key), что подчеркивает важность безопасного кодинга . В 2026 году ожидается более тесная интеграция со стеком OpenTelemetry для сбора трассировок и метрик прямо из коробки.
Заключение
FastAPI в 2026 году — это зрелый, невероятно быстрый и современный фреймворк. Последние обновления сфокусированы на:
- Максимальной производительности (сериализация на Rust).
- Современных протоколах (удобный стриминг).
- Упрощении кодовой базы (удаление устаревших компонентов).
С учетом бума AI и микросервисов, FastAPI не просто сохраняет актуальность, а задает тон в Python-разработке . Если вы еще не знакомы с ним — лучшее время для начала было вчера, а второе лучшее — сегодня. Если вы уже используете его — обновляйте версии и следите за changelog, чтобы использовать все новейшие фичи.
