Опыт использования FastAPI
Posted October 15, 2021 by ‐ 5 min read
Разработчик как главный потребитель технологий
В современно мире все очень быстро меняется и в этих условиях бизнес должен реагировать моментально. Только быстрая реакция даст возоможность переориентироватся на лету и поймать волну “хайпа”, чтобы привлечь новых клиентов и увеличить продажи.
Ярким примером волны хайпа в недалеком прошлом была игра Among Us. Огромное количество бизнесов следало тематические компании и акции.
И в этих условиях быстрых изменений должны работать и IT сотрудники. Нам не чужды ситуации когда в начале дня ты начинаешь работать над задачей, а уже вечером оказывается, что она утратила свой приоритет и больше не нужна бизнесу (я утрирую конечно 😅… или нет 😢)
Все более популярными стают user-friendly фрейворки, которые позволяют с минимальными усилиями решать проблемы бизнеса. Не всегда такие решения отвечают всем канонам теории программирования, но это и не важно. Важно то, что эти инструменты решают проблемы бизнеса эффективнее других.
Сейчас при выборе фреймворка стоит смотреть на несколько критериев:
- На сколько активно поддерживается фреймворк? (Будет ли сам Фреймворк быстро изменяться и адаптироватся с течением времени, будут ли быстро фиксится ошибки и т.д.)
- Прост ли фреймворк в использовании? (Как быстро можно сделать усредненую задачу. Если фреймворк не упрощает работу - это плохой Фреймворк)
- На сколько хорошо документирован фреймворк?
Если по этим критериям все хорошо - то у вас в руках подходящий и надежный инструмент, который прослужит вам не один проект.
Какие есть фреймворки на рынке python?
Уже написано огромное количество статей, которые сравнивают фреймворки, поэтому в этот статье мы просто перечислим самые популярные. Для желающих ознакомится с подробным сравнением привожу список статей:
- 7 Top Python Frameworks You Should Consider for Your Next Project
- Top 13 Python Web Frameworks to Learn in 2021
- 10 Best Python Frameworks For Web Development
- The Most Popular Python Web Frameworks in 2021
Среди существующих фреймворков можно выделить несколько основных:
- 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 - мы будем рады вам помочь.