Upgrade to Pro — share decks privately, control downloads, hide ads and more …

FastAPI как основной framework для python бекендов

FastAPI как основной framework для python бекендов

FastAPI уже не первый год с нами.
Последние пару лет фреймворк явно на подъеме: количество звезд на гитхабе уже больше чем 50% от мастодонтов рынка — django, flask. В ds среде и в каждом туториале flask, в каждой второй вакансии суперсовременные горизонтально масштабируемые сервисы на… django.

Однако, про fastapi разговоров довольно немного и проникновение как в рынок, так и в публичное пространство у него не велико. И уж тем более, пока ещё про него не говорили с позиции продакшена (как минимум, на конференциях).

Так сложилось, что в банке мы сделали на нем несколько десятков сервисов и уже больше года активно эксплуатируем как раз в том самом продакшене, а так же рекомендуем его внутри, как основной, практически всем. За это время мы успели полюбить этот фреймворк, но при этом нашли его «зоны роста».

В своем докладе я постараюсь раскрыть три темы:
сделаю краткий обзор на сам фреймворк
поделюсь тем, чего ему не хватает для полноценной жизни в продакшене (с моей точки зрения)
подсвечу довольно очевидные потенциальные проблемы.
Ну и, конечно же, займусь неймдроппингом: FastAPI!

https://www.youtube.com/watch?v=4zjj1aHJoko

Denis Anikin

April 01, 2023
Tweet

More Decks by Denis Anikin

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  16. Что там у Django?
    16

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  23. Валидация
    23

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  29. Вернемся к FastAPI

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  47. Опасайтесь

    View Slide

  48. 48

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide