FastAPI в 2026: Обзор новых возможностей, Roadmap
1

FastAPI в 2026: Обзор новых возможностей, Roadmap

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 модели для ответа.

python
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 записей, не загружая их все в память сразу.

python
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. Просто полагайтесь на стандартный механизм сериализации.

Было (раньше):

python
from fastapi.responses import ORJSONResponse

@app.get("/items", response_class=ORJSONResponse)
async def get_items():
    return [{"item": "Foo"}]

Стало (сейчас):

python
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-модели:

python
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/:

json
app/
├── users/
│   └── route.py          # -> GET /users, POST /users
│   └── [id]/
│       └── route.py      # -> GET /users/123
└── items/
    └── route.py          # -> GET /items

Пример содержимого app/users/[id]/route.py:

python
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 году — это зрелый, невероятно быстрый и современный фреймворк. Последние обновления сфокусированы на:

  1. Максимальной производительности (сериализация на Rust).
  2. Современных протоколах (удобный стриминг).
  3. Упрощении кодовой базы (удаление устаревших компонентов).

С учетом бума AI и микросервисов, FastAPI не просто сохраняет актуальность, а задает тон в Python-разработке . Если вы еще не знакомы с ним — лучшее время для начала было вчера, а второе лучшее — сегодня. Если вы уже используете его — обновляйте версии и следите за changelog, чтобы использовать все новейшие фичи.

Поделиться: