Slide 1

Slide 1 text

{ Название надо было покороче придумать, но я был не особо адекватен, когда его придумывал… FastAPI как основной framework для python бекендов

Slide 2

Slide 2 text

Представлюсь 2 Вдруг это кому-то важно — Меня зовут Аникин Денис — team lead в команде Chat, Raiffeisenbank — community lead в Python Community — Увлекаюсь fullstack: разрабатываю на python и typescript — Занимаюсь развитием Dev(Sec?)Ops практик — Мой сайт: https://xfenix.ru/ — В айти давно, но пока следов выгорания нет (зато есть обугливание)

Slide 3

Slide 3 text

Издалека: какие задачи у питонистов в банке? 3 — Пишем бекенды для разных частей банка во множестве команд — Занимаемся многими автоматизациями процессов (CRM и разными другими вещами, о которых я не могу рассказать, но которые звучат не так скучно как просто «автоматизация») — Делаем внутреннее облако аля AWS (поменьше, конечно, мы не такие безосные) — Активно развиваем бекенды вместе с DS (которые тоже во многом бекендеры- питонисты ☺)

Slide 4

Slide 4 text

Кратко: у нас много бекендов 4

Slide 5

Slide 5 text

А теперь перейдём к теме доклада

Slide 6

Slide 6 text

2018 год — каков выбор фреймворков? 6 Ещё были живы рэп батлы и на машины не накидывали «допов» за 500к+… Django + DRF Flask Aiohttp + много всего

Slide 7

Slide 7 text

И тут бац! Появился 7

Slide 8

Slide 8 text

Что же такого интересного в FastAPI? 8 — Револю… ну ладно, очень очень свежий подход — Аннотации типов (привет, HUG?) — Универсальный подход к обработке всего «приходящего» — Schema-oriented: openapi.json и отсюда Swagger, Redoc, Pydantic — Инверсия зависимостей — Совмещение асинхронного подсета языка с синхронным — Скорость разработки и выполнения

Slide 9

Slide 9 text

Больше про аннотации типов 9 — Можно задавать обязательные параметры — Автоматически валидируются данные — Автоматически конвертируются данные — Автоматически выдаются ошибки — Важно всё, что пишется в аргументах «вьюх»

Slide 10

Slide 10 text

Как выглядят аннотация 10 Не слишком важно что здесь происходит (ничего хорошего)

Slide 11

Slide 11 text

Что можно сказать про фреймворк в общем? 11 — Лучше всего подходит для HTTP based API REST, JSON over HTTP — точно. Возможно JSON RPC — Подходит для Websocket приложения и GraphQL приложений — FastAPI за вас делает множество вещей с помощью «магии». Многие не любят магию, но здесь её применение того стоит

Slide 12

Slide 12 text

Погружаемся в FastAPI 12

Slide 13

Slide 13 text

Чуть сложнее 13

Slide 14

Slide 14 text

Как это писать? 14 — Полагается на аннотации типов, аргументы функции и дефолтные значения — Нужен query параметр? Возьми Query или можно задать прямо аргументом — Нужен кусок пути? Возьми Path — Нужен заголовок? Возьми Header — Нужны cookie? Возьми Cookie — Для json тела можно взять Body (+ магия) или Field — Для форм есть Form

Slide 15

Slide 15 text

In grave need of best player opinion 15 Нас очень важно мнение лучшего игрока на этом рынке!

Slide 16

Slide 16 text

Что там у Django? 16

Slide 17

Slide 17 text

И к FastAPI — у нас тут строковая валидация 17

Slide 18

Slide 18 text

Числовая валидация 18

Slide 19

Slide 19 text

Сразу может быть не очень ясно 19 — q: Optional[str] = Query(None) — опциональный параметр — q: Optional[str] = None — тоже самое — q: str = Query(..., min_length=3) — обязательный параметр (Ellipsis)

Slide 20

Slide 20 text

Внезапно! Немного о Pydantic

Slide 21

Slide 21 text

Лучшая библиотека валидации и настроек? 21

Slide 22

Slide 22 text

Что представляет из себя? 22 — библиотека для валидации данных и менеджмента настроек — очень вербозные модели, основанные на аннотациях типов (их могут читать даже те, кто не знаком с python совсем) — 12 factor поклонники будут в востороге!

Slide 23

Slide 23 text

Валидация 23

Slide 24

Slide 24 text

Комплексная иерархия 24

Slide 25

Slide 25 text

Можно рекурсивно 25

Slide 26

Slide 26 text

Причём здесь настройки? 26

Slide 27

Slide 27 text

Это просто что-то нереальное… 27

Slide 28

Slide 28 text

Ещё это быстро (ну так говорят их бенчмарки) 28 И чего бы я вдруг им не доверял?

Slide 29

Slide 29 text

Вернемся к FastAPI

Slide 30

Slide 30 text

Выходные модели с Pydantic 30

Slide 31

Slide 31 text

Конвертация всего во всё с помощью pydantic 31

Slide 32

Slide 32 text

Поддержка датаклассов 32

Slide 33

Slide 33 text

Удивительная обработка Body 33

Slide 34

Slide 34 text

Зачем нужен Body? 34 Нужен для случая обработки тела запроса в виде JSON

Slide 35

Slide 35 text

Инверсия зависимостей 35

Slide 36

Slide 36 text

Больше про инверсию 36 — Подходит, например, для выделения любых общих кусков логики — Можно организовать подключение внешних ресурсов, например БД — Depends можно использовать и в функциях, и в декораторах, и в самом «приложении» — Можно вообще всю логику писать через инверсию

Slide 37

Slide 37 text

Промежуточные итоги

Slide 38

Slide 38 text

Классные штуки фреймворка 38 — отличная документация (но есть куда улучшать) — великолепный pydantic + pydantic settings (12factor app зовёт, берет переменные из .env файла/просто окружения, все с валидацией, парсингом, тайпкастом) — легкая интеграция с шаблонным движком, graphql — поддержка websocket — поддержка почти всего http протокола — высокая скорость работы — middleware — security

Slide 39

Slide 39 text

Классные штуки фреймворка 2 39 — поддержка JWT, Oauth 2 — возможность масштабирования — для тех, кому мало стандартной инверсии зависимостей — сторонние проекты неплохо интегрируются, например, отличный фреймворк dependency injector — BackgroundTasks — за ним можно поставить джангу или фласк 🤷🤷🤷 — разные варианты ответов, в т.ч. Streaming — (свежак) SqlModel от автора фреймворка — pydantic + sql alchemy

Slide 40

Slide 40 text

Почему выбрали как основной 40 — мы довольно быстро пришли к мысли, что многие другие фреймворки медленнее в разработке, чем FastAPI — комбинирование синхронного и асинхронного кода позволяет даже новичкам спокойно начинать работу с фреймворком без головной боли — хорошая дока позволяет быстро погружаться — очень очень быстро пишется код — очень надёжно — очень быстро работают бекенды

Slide 41

Slide 41 text

Спорный момент

Slide 42

Slide 42 text

Самый быстрый фреймворк? 42 Цитата из документации FastAPI «Fast: Very high performance, on par with NodeJS and Go (thanks to Starlette and Pydantic) »

Slide 43

Slide 43 text

Не факт 43 Но фреймворк правда быстрый

Slide 44

Slide 44 text

Заметки из продакшена

Slide 45

Slide 45 text

Чего нам не хватает? 45 — нет версионирования — нет ORM — нет возможности генерить данные по pydantic моделям в тестах — актуально для тех у кого много сервисов: — нет стандартного healtcheck — нет стандартного подхода к логгированию с request_id

Slide 46

Slide 46 text

Чего нам не хватает? 46 — нет версионирования <— написали пакет — нет ORM <— взяли databases (сейчас автор завез SqlModel) — нет возможности генерить данные по pydantic моделям в тестах <— не решено пока ☹ — актуально для тех у кого много сервисов: — нет стандартного healtcheck <— написали пакет — нет стандартного подхода к логгированию с request_id <— написали пакет

Slide 47

Slide 47 text

Опасайтесь

Slide 48

Slide 48 text

48

Slide 49

Slide 49 text

❌ Не делайте так 49 — У uvicorn очень простой супервизор — Он не умеет перезапускать после самоубийства воркеры — Мы добавили limit-max-requests — Мы не читатели, мы писатели: на доку мы забили — В проде обнаружили количество рестартов подов > 9000 — Дебажили — Дебажили — Прочли доку …

Slide 50

Slide 50 text

✅ Решение? 50 — Читать доку… — На самом деле взяли gunicorn c воркером uvicorn ☺ — Если вам нужен супервизор, это точно не uvicorn

Slide 51

Slide 51 text

❌ Не делайте так 51 В адрес вы можете нечаянно положить сенситивные данные. Так вот потом в документации вы с удовольствием увидите как они спалились.

Slide 52

Slide 52 text

/ Спасибо. Вопросы? 52 https://github.com/xfenix [email protected] xfenix.ru