Опыт использования FastAPI

Posted October 15, 2021 by  ‐ 5 min read

Разработчик как главный потребитель технологий

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

Ярким примером волны хайпа в недалеком прошлом была игра Among Us. Огромное количество бизнесов следало тематические компании и акции.

И в этих условиях быстрых изменений должны работать и IT сотрудники. Нам не чужды ситуации когда в начале дня ты начинаешь работать над задачей, а уже вечером оказывается, что она утратила свой приоритет и больше не нужна бизнесу (я утрирую конечно 😅… или нет 😢)

Все более популярными стают user-friendly фрейворки, которые позволяют с минимальными усилиями решать проблемы бизнеса. Не всегда такие решения отвечают всем канонам теории программирования, но это и не важно. Важно то, что эти инструменты решают проблемы бизнеса эффективнее других.

Сейчас при выборе фреймворка стоит смотреть на несколько критериев:

  • На сколько активно поддерживается фреймворк? (Будет ли сам Фреймворк быстро изменяться и адаптироватся с течением времени, будут ли быстро фиксится ошибки и т.д.)
  • Прост ли фреймворк в использовании? (Как быстро можно сделать усредненую задачу. Если фреймворк не упрощает работу - это плохой Фреймворк)
  • На сколько хорошо документирован фреймворк?

Если по этим критериям все хорошо - то у вас в руках подходящий и надежный инструмент, который прослужит вам не один проект.

Какие есть фреймворки на рынке python?

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

Среди существующих фреймворков можно выделить несколько основных:

  • Flask - синхронный, минималистичный, но обладает достаточно скромным фукционалом из коробки. Требует подключения большого количества сторонних библиотек (в этом и его плюс так как это дает большую гибкость при настройке проекта)
  • Django - синхронный (в 3й версии начал включать возможность создания асинхронных эндпоинтов), обладает отличной экосистемой. В большенстве случаев является выбором по умолчанию для новых проектов
  • aiohttp - Сильно специализированный асинхронный фреймворк. Очень низкоуровневый и имеет большой порог вхождения, но дает большую производительность.
  • FastAPI - асинхронный и относительно новый фреймворк. Использует функциональный подход в обработке запросов, автодокументация и имеет dependency injection из коробки.

В данной статье мы обсудим опыт использования FastAPI и его преимущества.

Быстрый запуск FastAPI проекта

Минимальное приложение на FastAPI выглядит так

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello World"}

для запуска понадобится установить uvicorn и fastapi

pip install fastapi uvicorn[standard]

После этого в папке с можем выполнить uvicorn main:app --reload (при условии что мы поместили код в файл main.py)

Далее мы можем открыть в браузере http://127.0.0.1:8000/ и получить ответ от приложения.

И сразу же будет доступна документация по адресу http://127.0.0.1:8000/docs и http://127.0.0.1:8000/redoc

Документация является очень важной частью при взаимодействии бекенд разработчика с другими участниками (qa, frontend и др.) так как является источником правды о текущем состоянии API интерфейса. Очень важно чтобы документация генерировалась автоматически, в противном случае ответственность за ее обновление ложится на разработчика, что часто ведет к ошибкам или быстрому ее устареванию (документация может много недель не обновлятся ввиду множества “очень важных” причин).

Источник

Встороенная валидация

При создании эндпоинтов первое, что может понадобиться - это проверять GET параметры. FastAPI имеет встроенный механизм валидации, что позволяет объявить ожидаемые GET параметры одной строкой. В данном примере мы ожидаем skip и limit и можно увидеть, что этим значениям выставлены значения по умолчанию на случай отсутствия их в запросе.

@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
    return fake_items_db[skip : skip + limit]

Источник

Dependency injection

Одна из фишек FastAPI это dependecy injection. Это очень удобно особенно при настройке валидации токенов/куки и получении соединения к базе.

Подклчение к базе может быть инкапсулировано в функцию (настройка подключения базы данных через sqlalchemy описан тут)

Пример функции которая возвращает сессию:

# Dependency
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

Источник

Для использования этой зависимости надо импортировать класс Depends

from fastapi import Depends после этого мы можем указать эту зависимость в аргументах нашего контроллера как db: Session = Depends(get_db)

Полный пример:

@app.get("/users/", response_model=List[schemas.User])
def read_users(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
    users = crud.get_users(db, skip=skip, limit=limit)
    return users

Преимущество этого подхода в том, что в тестах мы можем подменить функцию get_db и создавать в ней подключение к временной, тестовой базе данных.

Источник

Темплейт для быстрого старта

Документация рекламирует несколько темплейтов проектов. Один из них включает в себя огромное количество, необходимых почти каждому проекту, фич. Этот темплейт построен на основе cookiecutter , который позволяет создавать настраиваемые темплейты проектов.

Сгенерировать темлейт можно с помощью нескольких команд

pip install cookiecutter
cookiecutter https://github.com/tiangolo/full-stack-fastapi-postgresql

cookiecutter задаст вам несколько вопросов о конфигурации проекта.

Темплейт уже докерезирован и для его запуска нужно перейти в папку с проектом и выполнить docker-compose up (у вас должен быть установлен docker)

После скачивания и сборки контейнеров у вас будет запущен работающий инстанс со всем необходимым для дальнейшей разработки.

Выводы

Мы видим, что создатели фреймворка позаботились о DX (developer experience) и это положительно сказывается на общей производительности разработки приложений и удовлетворенностью от использования технологии. Стотит так же отметить подробную документацию фреймворка, которая содержит в себе массу примеров и позволяет без особых проблем использовать готовые куски кода прямо у себя в проекте.

Если говорить о производительности - FastAPI это один из самых быстрых python web фреймоврков. Python REST frameworks performance comparison

В WildWildSoft мы используем этот фреймворк так как он дает возможность наиболее эффективно решать бизнес задачи. Мы имеем возможность быстро адаптировать проекты под нужды бизнеса и доставлять фичи в кратчайшие сроки.

Если вас заинтересовала разработка проекта на FastAPI можете написать на sales@wildwildsoft.com - мы будем рады вам помочь.