Как работает FastAPI и как поднять простое REST API на Python
FastAPI — это современный фреймворк для создания API на Python, разработанный с упором на высокую производительность, простоту разработки и автоматическую генерацию документации. Он использует асинхронную модель (async/await), поддерживает аннотации типов, и по скорости работы находится рядом с Node.js и Go благодаря базе на Uvicorn + Starlette.
FastAPI стал стандартом для Python-бэкендов, микросервисов, внутренних инструментов, телеграм-ботов и интеграций, где нужны быстрые и лёгкие HTTP-сервисы.
Почему FastAPI стал таким популярным
FastAPI решает боли, которыми страдали предыдущие Python-фреймворки:
- ручное описание схем данных
- нет встроенной документации
- сложные зависимости
- слабая работа с асинхронностью
А в FastAPI это есть «из коробки»:
- автоматическая Swagger-документация
- строгие модели данных на Pydantic
- асинхронный обработчик запросов
- автоматическая валидация входящих данных
- высокая производительность благодаря Starlette
- полностью типизированный код
И главное — код получается компактным и читаемым.
Установка FastAPI
Для работы понадобится:
pip install fastapi uvicornuvicorn — это ASGI-сервер, который запускает приложение.
Самый простой сервер на FastAPI
Создадим main.py:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"message": "Hello, FastAPI!"}Запуск:
uvicorn main:app --reloadПосле запуска API доступно по адресу:
http://127.0.0.1:8000/
Автоматическая Swagger-документация
Без единой строчки конфигурации FastAPI создаёт:
- Swagger UI:
http://127.0.0.1:8000/docs - ReDoc:
http://127.0.0.1:8000/redoc
Это удобно для тестирования API и передачи документации коллегам.
Маршруты и HTTP-методы
FastAPI поддерживает все основные методы:
@app.get("/users")
def get_users():
return ["alex", "maxim"]
@app.post("/users")
def create_user(user: dict):
return {"status": "created", "user": user}
@app.put("/users/{user_id}")
def update_user(user_id: int, data: dict):
return {"id": user_id, "update": data}
@app.delete("/users/{user_id}")
def delete_user(user_id: int):
return {"status": "deleted", "id": user_id}Модели данных через Pydantic
Pydantic — это строгие модели данных, которые гарантируют правильный формат входящих параметров.
Пример — создание пользователя:
from pydantic import BaseModel
class User(BaseModel):
name: str
age: int
email: strИспользуем модель в POST-маршруте:
@app.post("/users")
def create_user(user: User):
return {"created": user}Если отправить неправильные данные (например, возраст строкой), FastAPI автоматически вернёт JSON-ошибку.
Асинхронные обработчики
FastAPI создан на основе Starlette, поэтому полностью поддерживает async:
@app.get("/slow")
async def slow_handler():
await asyncio.sleep(2)
return {"status": "done"}Если запустить несколько таких запросов, FastAPI обработает их параллельно, не блокируя поток.
Передача параметров в запросе
Путь
@app.get("/items/{item_id}")
def get_item(item_id: int):
return {"item_id": item_id}Query-параметры
/search?limit=10&query=test
@app.get("/search")
def search(limit: int = 10, query: str = None):
return {"limit": limit, "query": query}Подключение к базе данных
FastAPI не навязывает ORM.
Можно использовать:
- SQLAlchemy
- Tortoise ORM
- Prisma Client Python
- asyncpg
Пример подключения через SQLAlchemy:
from sqlalchemy import create_engine
engine = create_engine("postgresql://user:pass@localhost/db")FastAPI хорош тем, что легко комбинируется с любыми инструментами.
Dependency Injection в FastAPI
FastAPI предлагает механизм зависимостей — удобный способ передавать общие объекты (БД, конфиги, сервисы).
from fastapi import Depends
def get_token():
return "secret-token"
@app.get("/protected")
def protected(token: str = Depends(get_token)):
return {"token": token}Это похоже на DI (Dependency Injection) в NestJS и других современных фреймворках.
Middleware
FastAPI поддерживает middleware — функции, которые выполняются до и после обработки запроса.
from fastapi import Request
@app.middleware("http")
async def add_header(request: Request, call_next):
response = await call_next(request)
response.headers["X-App"] = "FastAPI"
return responseКак развернуть FastAPI
Обычно используют:
- Uvicorn + Gunicorn (uvicorn workers)
- Docker
- Nginx как reverse proxy
Пример Dockerfile:
FROM python:3.12
WORKDIR /app
COPY . .
RUN pip install fastapi uvicorn
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]Итоги
FastAPI — это один из самых удобных и быстрых способов поднять современное REST API на Python. Он сочетает асинхронность, строгие типы, генерацию документации и высокую производительность. Благодаря простоте кода и гибкой структуре FastAPI подходит и для простых проектов, и для сложных микросервисных экосистем.
Настроить мониторинг за 30 секунд
Надежные оповещения о даунтаймах. Без ложных срабатываний