Включите исполнение JavaScript в браузере, чтобы запустить приложение.
14 окт 2024

FastAPI на Python: что это такое, как работает и зачем нужен

В статье разберемся, что такое FastAPI на Python. Какие возможности у данного фреймворка и для чего он нужен? Как установить, запустить и начать работать с FastAPI? Также рассмотрим несколько примеров использования FastAPI. Подробнее читайте на сайте.
  1. Что такое FastAPI
  2. Какие возможности и зачем нужен
  3. Как установить FastAPI
  4. Как запустить FastAPI
  5. Преимущества FastAPI
  6. Примеры использования FastAPI

Что такое FastAPI

FastAPI — это современный и высокопроизводительный веб-фреймворк для создания API на языке программирования Python, который был запущен в 2018 году. Он разрабатывался как простой и удобный инструмент для ускорения разработки и уменьшения количества шаблонного кода.

Возможности и назначение

FastAPI позволяет разработчикам создавать быстрые, надежные и масштабируемые API на Python благодаря следующим особенностям:

  • эффективному использованию ресурсов за счет применения асинхронных функций;
  • валидации данных: дает возможность определить модель данных и установить правила для каждого поля модели, что сократит количество ошибок, облегчит отладку и тестирование;
  • встроенным инструментам, позволяющим справляться с увеличивающейся нагрузкой: поддержка горизонтального масштабирования, возможность интеграции с различными сервисами — брокерами сообщений, облачными платформами.

Как установить FastAPI

Установить FastAPI довольно просто — с помощью стандартного менеджера пакетов pip для Python. Итак, для установки в командной строке необходимо ввести следующую команду:

pip install fastapi
py

После этого фреймворк будет установлен, но для работы с ним также понадобится ASGI-сервер, который поддерживает протокол Asynchronous Server Gateway Interface. Можно использовать Hypercorn или Univern, но здесь будет использоваться последний: он легковесный, и именно его рекомендует использовать документация.

В командной строке нужно ввести команду:

pip install "uvicorn[standard]"
py

Этого достаточно для того, чтобы запустить фреймворк и начать работу, но иногда могут понадобиться дополнительные библиотеки для Python. Установим их на примере библиотеки SQLAlchemy:

pip install sqlalchemy
py

Здесь нет ничего сложного или необычного.

Как запустить FastAPI

Перед запуском нужно написать первое приложение, оно будет достаточно простым. Для этого создаем файл main.py и записываем туда следующий код:

# Импортируем класс
from fastapi import FastAPI


# Создаем экземпляр класса
app = FastAPI()


# @app — декоратор, позволяющий определить метод для маршрута, в данном случае это метод GET
# Этот декоратор будет применяться к функции read_root()
# В данном случае декоратор указывает, что функция будет обрабатывать GET-запросы к корневому пути проекта ("/")
# Можно использовать и другие методы: POST, PUT и так далее
@app.get("/")
# Определяем асинхронную функцию read_root(), которая будет возвращать JSON-объект с ключом "message" и значением "Welcome to framework!" — преобразование в JSON-формат осуществит фреймворк
async def read_root():
    return {"message": "Welcome to framework!"}
py

Следует отметить, что называть функции можно как угодно, это лишь пример именования. Также не обязательно использовать асинхронные функции.

Теперь можно осуществить непосредственно запуск приложения, для этого вводим следующую команду:

uvicorn main:app --reload
py

Здесь запускается сервер uvicorn, где main — это имя файла с приложением, app — переменная с экземпляром класса, --reload включает автоматический перезапуск сервера, если код изменился, что очень удобно для разработки.

Если все работает корректно, то вы получите URL-адрес: обычно это http://127.0.0.1:8000, перейдя по которому можно увидеть JSON-ответ.

Преимущества FastAPI

  • Высокая производительность, которая достигается путем использования асинхронных функций — обрабатывается сразу несколько запросов.
  • Удобство использования. Синтаксис будет понятен любому программисту, знакомому с Python.
  • Автоматическая документация для вашего API: значительно упрощает разработку, тестирование, взаимодействие с клиентами и другими разработчиками. Просмотреть её можно по адресам /docs и /redoc.
  • Встроенная с помощью модуля Pydantic валидация, которая позволяет избежать ошибок и писать код более компактно. Объяснение ошибок возвращается в JSON-формате.
  • Поддержка популярных библиотек: SQLAlchemy, JWT, pytest и многие другие.
  • Поддержка внедрения зависимостей — Dependency Injection. Это означает, что разные классы не будут напрямую зависеть друг от друга, поэтому осуществлять внесение изменений в код, масштабирование и тестирование будет несколько проще.
  • Конечно же, активное сообщество тоже является плюсом, ведь это означает, что всегда можно будет получить помощь, обменяться опытом, посмотреть, как другие программисты работают с этим веб-фреймворком.

Примеры использования FastAPI

В качестве первого примера создадим простое приложение, которое будет выполнять роль ежедневника, в котором можно будет создавать задачи и просматривать их:

# Импортируем все необходимое
# BaseModel для создания моделей данных
# List для аннотации типов
from fastapi import FastAPI
from pydantic import BaseModel
from typing import List
from datetime import date
 
app = FastAPI()


# Определяем модель данных: класс Task наследуется от BaseModel и содержит в себе описание задачи — дату, заголовок и описание
class Task(BaseModel):
    date: date
    title: str
    description: str
 
# Пустой список, куда будут попадать задачи
tasks = []
 
# Добавляем декоратор, response_model=List[Task] означает, что ответом будет список объектов Task, функция get_tasks() будет возвращать все задачи
@app.get("/tasks", response_model=List[Task])
async def get_tasks():
    return tasks


# Здесь будет обрабатываться POST-запрос
@app.post("/tasks", response_model=Task)
async def create_task(task: Task):
    tasks.append(task)
    return task
py

Второй пример будет сложнее — напишем приложение для обработки платежей:

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, Field
 
app = FastAPI()


# Определяем модель данных: класс Payment содержит информацию о платеже — сумму, которая больше нуля, валюту и получателя
class Payment(BaseModel):
    amount: float = Field(..., gt=0, description="Неверная сумма платежа")
    currency: str
    recipient: str
 
# Определяем маршрут с динамическим параметром ({transaction_id}) — это номер транзакции, целое число
# Параметр payment содержит в себе информацию о платеже
# Если сумма платежа меньше нуля — всплывает ошибка 400 (Bad Request)
# Иначе возвращается JSON-ответ с данными о статусе транзакции, ее номере, сумме, валюте и получателе
@app.post("/process_payment/{transaction_id}")
async def process_payment(
    transaction_id: int,
    payment: Payment
):
    if payment.amount <= 0:
        raise HTTPException(status_code=400, detail="Неверная сумма платежа")


    return {"status": "Транзакция проведена успешно", "transaction_id": transaction_id, "payment": payment}
py