Tagir Khalilov
Tagir Khalilov
  • 2
  • 30 148
FastAPI приложение | Redis + Docker
В этом видео я покажу Вам, как можно связать FastAPI и Redis, а так же обернуть все приложение в Docker контейнеры с последующей оркестрацией
Ссылка на видео со структурой FastAPI приложения - czcams.com/video/IpSRs6ZNA5k/video.html&ab_channel=TagirKhalilov
Ссылка на репозиторий с кодом проекта - github.com/geekceo/FastAPI-app-Redis-Docker
zhlédnutí: 13 391

Video

Архитектура FastAPI приложения | Шаблон
zhlédnutí 17KPřed rokem
В данном видео вы увидите, как можно легко организовать базовую структуру приложения FastAPI для дальнейшего удобного масштабирования проекта, не упираясь в ограничения архитектуры. Сможете получить удобство навигации по проекту и эффективность в командной разработке Ссылка на GitHub шаблона - github.com/geekceo/FastAPI-app-Structure-Template

Komentáře

  • @rozovayautopiya
    @rozovayautopiya Před 4 měsíci

    Превосходно

  • @rozovayautopiya
    @rozovayautopiya Před 4 měsíci

    Лучший

  • @semimaks
    @semimaks Před 5 měsíci

    Спасибо за краткое объяснение без лишней воды! Я так понимаю вы применяете в своём подходе методологию чистой архитектуры?

  • @bgs12
    @bgs12 Před 6 měsíci

    10 тыс просмотров на февраль 2024 года. Это успех! Давай ещё ролики про архитектуру FAST API

  • @lianakalpakchyan4454
    @lianakalpakchyan4454 Před 6 měsíci

    Greeaat❤❤❤ Why just 2 videos?😢

  • @zrxmax_
    @zrxmax_ Před 9 měsíci

    можно писать просто from .routes import Route . обозначит текущий каталог

    • @tagirkhalilov8227
      @tagirkhalilov8227 Před 9 měsíci

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

  • @MDFireX5
    @MDFireX5 Před 9 měsíci

    Шакальное качество, тупо скипаю

  • @MB-mi4ed
    @MB-mi4ed Před rokem

    Вот бы еще грамотно asyncpg с pool в шаблон завести.

  • @user-it3yo1sn6i
    @user-it3yo1sn6i Před rokem

    интересное и полезное видео. странно что у канала так мало подписчиков

  • @alexeymatveev9031
    @alexeymatveev9031 Před rokem

    что -то не получается, жалко нет requirements.txt... A, все, заработало. Спасибо! Супер видео, вернулся спустя время, очень в тему!

  • @user-xr2vl5wo7w
    @user-xr2vl5wo7w Před rokem

    Благодарю, Отличное видео. Интересно было бы увидеть реализацию авторизации и регистрации через FastAPI-users или другую библиотеку👍

  • @user-vf7pc4tn9z
    @user-vf7pc4tn9z Před rokem

    Ох ты тут намудрил а не проще было класический SOA?

  • @user-vf7pc4tn9z
    @user-vf7pc4tn9z Před rokem

    о давай больше про микросервисы а rabbitmq знаешь?

  • @Chel1k7
    @Chel1k7 Před rokem

    А как тему пайчарма в vsc впихнуть?

    • @iswearican__
      @iswearican__ Před rokem

      я бы и не заметил, если бы не комент лол

    • @tagirkhalilov8227
      @tagirkhalilov8227 Před rokem

      Привет, вот это расширение для VCS marketplace.visualstudio.com/items?itemName=garytyler.darcula-pycharm

  • @citieslg
    @citieslg Před rokem

    Видео классное!!! Я в полном восторге! Приступаю к ручному копированию)

  • @citieslg
    @citieslg Před rokem

    Спасибо за урок. Прошел с удовольствием Огромная просба продолжай плиз

  • @isded1681
    @isded1681 Před rokem

    Архитектура похожа на архитектуру в Go

  • @fast_code
    @fast_code Před rokem

    Когда продолжение?

    • @tagirkhalilov8227
      @tagirkhalilov8227 Před rokem

      Привет! Очень загружен работой, очень надеюсь, что в ближайшие пару дней успею отснять и загрузить материал)

    • @fast_code
      @fast_code Před rokem

      @@tagirkhalilov8227 Круто, понимая сам загружен. Продолжай в том же духе, мне очень понравился твой подход к архитектуре.

  • @wadyn95
    @wadyn95 Před rokem

    Какое-то странное стремление всё сделать в ООП стиле, лишнее усложнени

  • @annaarbuz
    @annaarbuz Před rokem

    Ужос

  • @degtuarevvladimir9559

    Если снимешь для Redash, буду очень благодарен 😊

  • @deymonster2u
    @deymonster2u Před rokem

    Приветствую! Можешь сделать видео по интеграции в эту связку еще postgresql и pgadmin в docer-compose?

  • @unstoppableharrison140

    Какие главные сильные стороны у FastAPI?

    • @tagirkhalilov8227
      @tagirkhalilov8227 Před rokem

      Привет! Скорость и асинхронность за счет того, что основан на Starlette; поддержка OpenAPI и Swagger, что позволяет быстро генерировать документацию к своему API; расширяемость - есть много плагинов и расширений для FastAPI, поэтому можно легко дополнять встроенные возможности фреймворка и увеличивать функциональность

    • @unstoppableharrison140
      @unstoppableharrison140 Před rokem

      @@tagirkhalilov8227 спасибо за ответ!

  • @aiornerok3931
    @aiornerok3931 Před rokem

    А еще видео будет?

    • @tagirkhalilov8227
      @tagirkhalilov8227 Před rokem

      Привет! Да, будет, сейчас собираю материалы для следующего ролика

  • @MrHopeOrLess
    @MrHopeOrLess Před rokem

    Отличное видео! Как сделать себе такие же иконки в ВСе?)))))

    • @tagirkhalilov8227
      @tagirkhalilov8227 Před rokem

      Привет! Вот ссылка на расширение для VS Code - marketplace.visualstudio.com/items?itemName=vscode-icons-team.vscode-icons

  • @sergeydostovalov6180

    Автор, если честно, то это не архитектура, а какая то жесть. Полностью статический класс сервера - это какое то мохровое древнее зло, зачем вам класс для него? Использование датаклассов подобным образом - издевательство над самой сутью датаклассов, просто кровь из глаз. Эвенты для выполнения периодических тасков бизнеслогики - это что-то с чем-то. Нейминг pkg internal - что ты такое? Писали раньше на го? Такое ощущение, что вы где то начитались антипатернов и решили так потролить общественность.

    • @ukratitelkisok9726
      @ukratitelkisok9726 Před rokem

      Нужно ответное видео "что не так" я бы глянул

    • @umni_kot
      @umni_kot Před rokem

      У вас есть репозиторий с примером FastApi проекта? Я бы глянул. Без негатива, посмотрел бы как лучше делать.

    • @misterex99
      @misterex99 Před rokem

      Что вам мешает сделать ролик как нужно и ответом сюда отправить? Он не претендует на идеальную архитектуру, это просто пример связки контейнеров и библиотек, чтоб у новичков было представление что и как работает в связке, а дальше люди посмотрят надо им это или нет, или просто возьмут другой фрейворк для своих нужд.

  • @andreynd
    @andreynd Před rokem

    Классное видео, спасибо! Если снимешь еще по теме торговых алгоритмов, с использованием продвинутых технологий вроде редиса и докера, посмотрю с большим интересом.

  • @alexeymatveev9031
    @alexeymatveev9031 Před rokem

    спасибо, очень здорово, хотелось бы посмотреть как это прикручивается к фронтенду

  • @kab_psih
    @kab_psih Před rokem

    Спасибо, отличный подход!

  • @xewuss3750
    @xewuss3750 Před rokem

    Радует, когда видишь, что у других тоже не с первого раза получается )))

  • @ffff00-korj
    @ffff00-korj Před rokem

    Класс, давно искал такой, формат

  • @eugeneshershen7027
    @eugeneshershen7027 Před rokem

    структура проэкта хуйня полная

  • @ivan_inanych
    @ivan_inanych Před rokem

    Очень полезное видео полного развёртывания, понятно хоть, как и что друг с другом взаимодействует, было бы интересно посмотреть развёртывание какого-нибудь простенького, но полноценного веб-приложения с фронтом на вью или другом фрейме для фронта, и с бэком на fastapi или асинхронном flask, например, c авторизацией и, может даже, пагинацией

  • @Dem0rey
    @Dem0rey Před rokem

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

    • @tagirkhalilov8227
      @tagirkhalilov8227 Před rokem

      Привет! Воспользовавшись API Binance для получения списка всех пар, можно при помощи pydantic преобразовать полученный JSON в список словарей, а далее воспользовавшись функцией filter() получать данные нужной пары, например: list(filter(lambda currency: currency['symbol'] == 'BTCUSDT', currencyList)) Где curencyList - это список словарей, полученный из JSON Этот однострочник вернет такой ответ: [{'symbol': 'BTCUSDT', 'price': '23681.28000000'}]

    • @Dem0rey
      @Dem0rey Před rokem

      @@tagirkhalilov8227 понял спасибо)

  • @user-de9xw2bi8p
    @user-de9xw2bi8p Před rokem

    Спасибо вам большое , было очень полезно ;))

    • @tagirkhalilov8227
      @tagirkhalilov8227 Před rokem

      Привет! Рад, что видео было интересным для вас)

  • @ac130kz
    @ac130kz Před rokem

    fastapi utils не поддерживается уже 3 года

    • @tagirkhalilov8227
      @tagirkhalilov8227 Před rokem

      Привет! Но тем не менее в таких базовых примерах создания запланированных задач fastapi utils все ещё работает

    • @ac130kz
      @ac130kz Před rokem

      @@tagirkhalilov8227 ну такое, я бы не использовал такие библиотеки, у fastapi быстрый цикл разработки, это не джанго с дооолгими LTS. Как альтернатива - это портировать небольшими кусками в утилиты самому

  • @lil_fix
    @lil_fix Před rokem

    Мммм, что-то знакомое Можно ссылку на оригинальный проект?

  • @arka4443
    @arka4443 Před rokem

    Для чего это морока с роутами? Есть какой то аргумент в пользу ооп здесь?

    • @tagirkhalilov8227
      @tagirkhalilov8227 Před rokem

      Привет! Удобство навигации и заклад на масшатабируемость

    • @arka4443
      @arka4443 Před rokem

      @@tagirkhalilov8227 удобство? Масштабируемость? В этих классах наоборот легче запутаться, а что насчет масштабируемости? Фреймворк ты не будешь менять, что будет масштабироваться?

    • @tagirkhalilov8227
      @tagirkhalilov8227 Před rokem

      Будут добавляться сопутствующие технологии, orm, базы данных, брокеры сообщений и для взаимодействия со всем этим нужно все правильно разбить по пакетам и модулям. А насчет удобства - мне удобно, когда все лежит на своих полках, когда каждый класс и модуль отвечает за определенное действие. Может кому-то удобно по-другому. В видео я описал свое видение и показал то, что удобно мне, полагая, что поделюсь с другими, кто ищет удобную архитектуру для своих проектов. Я не надеюсь на то, что с этим согласятся все. Мое желание - это поделиться

    • @arka4443
      @arka4443 Před rokem

      @@tagirkhalilov8227 а чем фп не угодило? Тоже ведь можно разбить на модули) и каждая функция имеет свою зону ответственности. Ну раз уж так тебе вкусно, то вопросов нет, но как по мне это просто злоупотребление ООП

    • @tagirkhalilov8227
      @tagirkhalilov8227 Před rokem

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

  • @user-ok7xl2hl7t
    @user-ok7xl2hl7t Před rokem

    Интересно посмотреть на другие архитектуры но я обычно немного другую использую

    • @tagirkhalilov8227
      @tagirkhalilov8227 Před rokem

      Привет! Если у тебя есть репозиторий с примером твоей архитектуры, то мог бы ты дать ссылку? Я бы с удовольствием посмотрел)

    • @Syberby
      @Syberby Před 10 měsíci

      @@tagirkhalilov8227 я бы тоже)

  • @TheVenelo
    @TheVenelo Před rokem

    Правильно ли я понимаю, что events - startup и shutdown, что нужно сделать при старте приложения и что при его завершении? Пытаюсь понять нужно ли мне это использовать. Я low level в python. Первый раз увидел у кого то использование ... вместо pass. Так же написание осмысленных буковок в init файлы пакетов python, обычно какие ролики не смотрел обучающие никто особо не разбирал такое, но когда смотрел исходный код в библиотеках часто это видел и не особо понимал как с этим взаимодействовать, да и сейчас не сильно понимаю. Судя по всему в init файлы прописывают импорты, чтобы дальше в файле.py можно было проще импортировать(или вообще не импортировать) и использовать функции/методы класса. __routes__ это магический метод? как я понял они дефолтные типо __eq__, я не прав? Раздробленность проекта интересная.

    • @tagirkhalilov8227
      @tagirkhalilov8227 Před rokem

      Привет! Да, насчёт events ты все верно понял. А init файлы используют в основном для удобства импортирования, но они предоставляют гораздо больше возможностей, например, пара из них: 1) Указание магического поля ___all___ для удобства импортивания модулей пакета через * 2) Проверка зависимостей перед использованием пакета Насчёт __routes__ - это не магический атрибут, нижнее подчёркивание по бокам - это лишь синтактический сахар) Да и у магических методов/атрибутов - по 2 подчеркивания по бокам, а тут одно

    • @TheVenelo
      @TheVenelo Před rokem

      @@tagirkhalilov8227Спасибо за развернутый ответ!

  • @sashass099
    @sashass099 Před rokem

    Спасибо за отличные видео, неглядя лайк и подписка. Подскажи, в чем может быть проблема.. Всё сделал как у тебя: структура, содержимое, уделил этому время. Всё запускается, но почему-то тупо не работают ивенты, которые запланированы в on_startup и on_loop_startup. Уже всё облазил, вроде бы всё соответствует твоему коду, но тупо не работают эти ивенты, ошибок никаких нет. Ссылки на binance переписал верно, в postmanе проверил. Может обновишь репозиторий в соответствии с кодом из этого видео?

    • @tagirkhalilov8227
      @tagirkhalilov8227 Před rokem

      Привет! Спасибо за фидбек) Вот ссылка на репозиторий - github.com/geekceo/FastAPI-app-Redis-Docker Если вдруг не поможет, то отпиши под этим комментом, свяжемся в тг и я помогу тебе

    • @sashass099
      @sashass099 Před rokem

      @@tagirkhalilov8227 всё ок уже, какая-то странная ерунда была с os.getenv(..) Спасибо за репозиторий!!! Давай больше видео, давай еще подконнектим sqlalchemy асинхронный и вообще эндпоинты асинхронные) Чтоб всё по красоте) И еще RabbitMQ / Celery а затем CI/CD вот это будет самый нужный стек игрушек)

    • @tagirkhalilov8227
      @tagirkhalilov8227 Před rokem

      Рад, что заработало) Да, у меня в планах как раз эти технологии. Но я хочу разбить это на несколько видео, чтобы не вываливать большой поток информации в одном огромном видео)

  • @TheVenelo
    @TheVenelo Před rokem

    Не много странно, что в описании не указана ссылка на такой шаблон, для более наглядного изучения вне видео. Спасибо за контент)

    • @tagirkhalilov8227
      @tagirkhalilov8227 Před rokem

      Привет! Спасибо, что указал на это, добавил в описание. Ссылка - github.com/geekceo/FastAPI-app-Structure-Template

  • @bxxdan
    @bxxdan Před rokem

    Можете создать репозиторий этого шаблона на гитхабе?

    • @tagirkhalilov8227
      @tagirkhalilov8227 Před rokem

      Привет! Создал, вот ссылка на репозиторий - github.com/geekceo/FastAPI-app-Structure-Template

  • @annasmur4556
    @annasmur4556 Před rokem

    Спасибо за подробное и наглядное объяснение!

  • @user-po5tg2sy1j
    @user-po5tg2sy1j Před rokem

    Спасибо. Отличное видео. Очень хочется увидеть полный проект, который максимально приближен к "боевым" проектам. и связка в базой, брокерами, обработчиками и тд...

    • @tagirkhalilov8227
      @tagirkhalilov8227 Před rokem

      Привет, спасибо за фидбек) Готовлю материал для этого видео, в скором времени выложу)

  • @user-tb9or7ct2q
    @user-tb9or7ct2q Před rokem

    Круто, отличный ролик!

  • @romanok2014
    @romanok2014 Před rokem

    Мне понравился гайд, понятно и без воды. Но мне интересно есть ли смысл так усложнять код через такие абстракции с классами. Например подход как тут (гитхаб) AlexDemure/fastapi-architecture выглядит проще и в то же время такой же понятный для командной разработки. Хотелось бы услышать мнение на счет этого

    • @tagirkhalilov8227
      @tagirkhalilov8227 Před rokem

      Привет! Спасибо за отзыв) Касательно отличий между подходами в моем видео и в проекте AlexDemure: 1) Пройдясь по структуре проекта AlexDemure можно заметить, что там много пакетов, действительно, в этом нет ничего страшного, ведь проекты могут быть сколько угодно огромными. Тут дело в том, что некоторые из них можно классифицировать по роду назначения и разбить на отдельные родительские пакеты. Именно это я показывал, когда создавал 3 основных пакета и говоря про их назначение. Это намного упростит навигацию по проекту, так как разработчик будет сразу знать, где нужный ему модуль. Это позволит не отвлекаться на поиск среди множества пакетов, находящихся в одной директории. 2) Далее, касательно самой абстракции, в самом определении абстракции дается хороший совет о том, что каждый модуль/класс должен выполнять конкретную задачу и должен быть хорош именно в ней. Если задуматься - то это очень упрощает дальнейшую разработку. Ведь мы всегда знаем какой модуль за что отвечает. Один за инициализацию сервера, второй за регистрацию путей, третий за события. Каждый хорош в своем. Мы всегда знаем в какой модуль залезть для правок и обновлений. В свой подходе AlexDemure старался придерживаться этого, но не везде, из-за этого есть путаница, например в самом модуле main.py в пакете core. Вроде бы у него есть отдельный модуль для регистрации путей, но все равно в модуле main опять происходит регистрация, и описание событий там же, и запуск uvicorn там тоже. Получается сборная солянка и при дальнейшей работе нужно будет думать и искать - а где же я оставил события, какая из регистраций путей нужна мне сейчас? В файле urls.py или которую я в main писал? В подходе, который описан в видео такой путаницы быть не может, так как каждый пакет отвечает за конкретные модули, связанные "родом деятельности", и каждый модуль выполняет ровно одну свою задачу. Свой подход я выработал на основе именно коммерческой разработки, где так же сталкивался с разным описанием архитектуры приложения разной степени эффективности и удобства. В конце концов подытожил все в такой вид, о котором говорил и показывал в видео)

  • @annasmur4556
    @annasmur4556 Před rokem

    Интересно! Продолжай)