Основы FastAPI: Полное руководство для начинающих

Автор: Javohir Abdullayev · · Python

Основы FastAPI: Полное руководство для начинающих

Что такое FastAPI и почему именно он?

В современной веб-разработке создание бэкенд API является одной из ключевых задач. Хотя в мире Python долгие годы лидировали Django и Flask, в последнее время FastAPI приобрел беспрецедентную популярность. FastAPI — это современный веб-фреймворк с поддержкой асинхронности (asyncio), построенный на основе подсказок типов (type hints) в Python 3.8+ и обладающий высокой скоростью работы.

Его ключевые преимущества:

  • Высокая скорость: производительность на уровне NodeJS и Go (работает на базе Starlette и Pydantic).
  • Автоматическая документация: генерирует интерактивную документацию API через Swagger UI и ReDoc без необходимости писать её вручную.
  • Мощная валидация: автоматически проверяет входящие данные с помощью Pydantic и наглядно отображает ошибки.
  • Простота разработки: сокращает объем кода и повышает продуктивность разработчика.

1. Настройка рабочего окружения и установка

Чтобы начать работу с FastAPI, сначала создадим виртуальное окружение (virtualenv) и установим необходимые библиотеки. Нам понадобятся сам фреймворк FastAPI и ASGI-сервер uvicorn для запуска проекта.

# Создание и активация виртуального окружения
python -m venv venv
source venv/bin/activate  # Linux / MacOS
# venv\Scripts\activate   # Windows

# Установка библиотек
pip install fastapi uvicorn[standard]

2. Написание первого API эндпоинта

В папке проекта создадим файл main.py и напишем наш первый простой API:

from fastapi import FastAPI

app = FastAPI(
    title="Mening Birinchi API Loyiham",
    description="FastAPI asoslarini o'rganish uchun qo'llanma",
    version="1.0.0"
)

@app.get("/")
def root():
    return {"xabar": "Salom, PyCoder.uz o'quvchilari! FastAPI ga xush kelibsiz!"}

@app.get("/salom/{ism}")
def salom_ber(ism: str):
    return {"natija": f"Salom, {ism.capitalize()}! Siz muvaffaqiyatli API yaratdingiz."}

Чтобы запустить проект, выполните в терминале следующую команду:

uvicorn main:app --reload

Открыв в браузере адрес http://127.0.0.1:8000/salom/javohir, вы увидите ответ в формате JSON. Флаг --reload автоматически перезапускает сервер при изменении кода.

3. Автоматическая интерактивная документация API

Одна из лучших особенностей FastAPI — это интерактивная документация, доступная «из коробки» без сторонних плагинов. При работающем сервере откройте в браузере следующие адреса:

  • Swagger UI: http://127.0.0.1:8000/docs — возможность тестировать API эндпоинты прямо из браузера.
  • ReDoc: http://127.0.0.1:8000/redoc — красиво оформленная и удобная техническая документация.

4. Работа с Path и Query параметрами

При разработке API передавать данные через URL можно двумя способами: с помощью Path Parameters (параметры пути) и Query Parameters (параметры запроса).

@app.get("/kitoblar/{kitob_id}")
def kitob_tafsiloti(kitob_id: int, sahifa: int = 1, chop_etilganmi: bool = True):
    return {
        "kitob_id": kitob_id,
        "sahifa": sahifa,
        "chop_etilganmi": chop_etilganmi,
        "status": "Kitob ma'lumotlari topildi"
    }

Здесь kitob_id — обязательное целое число (int), а sahifa и chop_etilganmi — необязательные query-параметры со значениями по умолчанию. Если пользователь передаст строку вместо числа в kitob_id, FastAPI автоматически вернет ошибку 422 Unprocessable Entity.

5. Валидация данных с помощью Pydantic (POST-запросы)

Для получения новых данных от пользователя (например, при регистрации или добавлении товара) используется метод HTTP POST и модели Pydantic.

from pydantic import BaseModel, Field
from typing import Optional

class Mahsulot(BaseModel):
    nomi: str = Field(..., min_length=2, max_length=100)
    narxi: float = Field(..., gt=0, description="Narx noldan katta bo'lishi shart")
    mavjudmi: bool = True
    tavsif: Optional[str] = None

# Имитация базы данных (в памяти)
mahsulotlar_royxati = []

@app.post("/mahsulotlar/", status_code=201)
def mahsulot_yarat(mahsulot: Mahsulot):
    mahsulot_dict = mahsulot.model_dump()
    mahsulot_dict["id"] = len(mahsulotlar_royxati) + 1
    mahsulotlar_royxati.append(mahsulot_dict)
    return {"xabar": "Mahsulot muvaffaqiyatli saqlandi", "data": mahsulot_dict}

С помощью модели Pydantic строго проверяются тип каждого поля и установленные ограничения (длина, минимальное значение). При некорректных данных бэкенд возвращает понятный JSON-ответ с описанием ошибки без необходимости писать дополнительный код обработки.

6. Завершение мини-проекта CRUD

Теперь объединим всё изученное и добавим эндпоинты для получения и удаления товаров:

from fastapi import HTTPException

@app.get("/mahsulotlar/")
def mahsulotlarni_olish():
    return {"jami": len(mahsulotlar_royxati), "natijalar": mahsulotlar_royxati}

@app.delete("/mahsulotlar/{mahsulot_id}")
def mahsulot_ochir(mahsulot_id: int):
    for index, item in enumerate(mahsulotlar_royxati):
        if item["id"] == mahsulot_id:
            ochirilgan = mahsulotlar_royxati.pop(index)
            return {"xabar": "Mahsulot o'chirildi", "ochirilgan": ochirilgan}
    
    raise HTTPException(status_code=404, detail="Bunday ID ga ega mahsulot topilmadi")

Советы для начинающих разработчиков

  1. Всегда используйте Type Hinting: аннотации типов в Python делают код понятным и полностью раскрывают потенциал FastAPI.
  2. Активно пользуйтесь Swagger (/docs): тестируйте ваши API-эндпоинты прямо на месте без необходимости открывать Postman.
  3. Асинхронные функции: если вы обращаетесь к базе данных асинхронно, используйте async def. Для обычных синхронных задач достаточно def.
  4. Соблюдайте модульность: по мере роста проекта разделяйте эндпоинты по отдельным файлам с помощью APIRouter.

Заключение

FastAPI — отличный инструмент в мире бэкенда, сочетающий высокую производительность, простоту и удобство. Если вы хотите писать современные REST API на Python, FastAPI — один из лучших вариантов. В следующих уроках мы рассмотрим подключение этого API к базе данных PostgreSQL с использованием SQLAlchemy ORM.

Теги: #FastAPI #Python #REST API #Backend #Pydantic