Зачем нужен FastAPI, сравнение с Flask и Django REST Framework, установка и первые шаги
FastAPI — это современный, быстрый и эффективный способ создания API на Python. В этой теме вы поймёте, почему FastAPI стал стандартом индустрии и как он сравнивается с альтернативами.
Представьте, что вы создаёте API. Вам нужно:
Раньше это означало много шаблонного кода. FastAPI меняет правила игры.
1. Автоматическая валидация данных
Вместо ручных проверок if 'email' not in data вы объявляете типы, а FastAPI сам проверяет входные данные:
from pydantic import BaseModel
class UserCreate(BaseModel):
email: str # Обязательно строка
age: int # Обязательно целое число
@app.post('/users')
def create_user(user: UserCreate):
# user.email и user.age уже гарантированно правильных типов
return {'id': 1, **user.model_dump()}Если клиент отправит {"email": 123}, FastAPI автоматически вернёт ошибку 422 с подробным описанием проблемы.
2. Автоматическая документация
FastAPI генерирует интерактивную OpenAPI-документацию из ваших аннотаций типов:
@app.get('/users/{user_id}', response_model=UserResponse)
def get_user(user_id: int):
"""Получить пользователя по ID"""
...Откройте /docs в браузере — и у вас готовый Swagger UI с возможностью тестирования API.
3. Высокая производительность
FastAPI построен на Starlette (асинхронный веб-фреймворк) и Pydantic (валидация данных). Благодаря поддержке async/await, он конкурирует с Node.js и Go по производительности.
4. Интуитивный синтаксис
from fastapi import FastAPI
app = FastAPI()
@app.get('/')
def read_root():
return {'Hello': 'World'}Это весь код для создания работающего API.
| Критерий | Flask | FastAPI |
|---|---|---|
| Валидация | Ручная или через marshmallow | Встроенная через Pydantic |
| Документация | Требует flask-openapi, connexion | Автоматическая OpenAPI |
| Асинхронность | Ограниченная (Flask 2.0+) | Полноценная async/await |
| Производительность | ~1,000 req/s | ~20,000+ req/s |
| Типизация | Динамическая | Статическая с проверкой типов |
Когда Flask:
Когда FastAPI:
| Критерий | DRF | FastAPI |
|---|---|---|
| Экосистема | Полная (ORM, админка, аутентификация) | Минимальная (только API) |
| Сложность | Высокая, много магии | Низкая, явный код |
| Производительность | Ниже из-за накладных расходов Django | Выше, минималистичный |
| Обучение | Нужно знать Django | Достаточно Python |
Когда DRF:
Когда FastAPI:
python -m venv .venv
source .venv/bin/activate # Linux/macOS
# или
.venv\Scripts\activate # Windowspip install fastapi uvicorn[standard]Почему uvicorn[standard]?
uvicorn — ASGI-сервер для запуска FastAPI[standard] включает дополнительные зависимости:
uvloop — быстрая замена event loophttptools — быстрый HTTP-парсерwatchfiles — автоперезагрузка при разработкеwebsockets — поддержка WebSocketpython -c "import fastapi; print(fastapi.__version__)"ASGI (Asynchronous Server Gateway Interface) — это спецификация, которая позволяет асинхронным Python-приложениям общаться с веб-серверами.
До ASGI был WSGI (Web Server Gateway Interface), но он поддерживал только синхронные запросы. Каждый запрос блокировал поток, пока не завершится.
Проблема WSGI:
Запрос 1: [==== 2 сек ====] → Ответ
Запрос 2: [==== 2 сек ====] → Ответ
Запрос 3: [==== 2 сек ====] → Ответ
Преимущество ASGI:
Запрос 1: [==] [==] [==] → Ответ (параллельно!)
Запрос 2: [==] [==] [==] → Ответ
Запрос 3: [==] [==] [==] → Ответ
FastAPI использует ASGI, поэтому может обрабатывать тысячи одновременных соединений.
FastAPI состоит из трёх ключевых компонентов:
┌─────────────────────────────────────────┐
│ FastAPI App │
│ ┌─────────────┐ ┌─────────────────┐ │
│ │ Starlette │ │ Pydantic │ │
│ │ (роутинг, │ │ (валидация, │ │
│ │ middleware, │ │ сериализация) │ │
│ │ WebSocket) │ │ │ │
│ └─────────────┘ └─────────────────┘ │
└─────────────────────────────────────────┘
↓
┌───────────┐
│ Uvicorn │
│ (ASGI │
│ сервер) │
└───────────┘
Вот полный пример минимального API:
from fastapi import FastAPI
app = FastAPI(
title="My API",
description="Моё первое API",
version="1.0.0"
)
@app.get('/')
def read_root():
return {'message': 'Hello, World!'}
@app.get('/items/{item_id}')
def read_item(item_id: int, q: str | None = None):
return {'item_id': item_id, 'q': q}Запуск:
uvicorn main:app --reloadmain — имя файла (main.py)app — переменная с приложением--reload — автоперезагрузка при измененияхОткройте http://localhost:8000/docs — и вы увидите готовую документацию!
В следующих темах вы:
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.