Теперь я усваиваю на 200% лучше. Синхронизация произошла!!! Такая подача - спокойный обычный разговор - the best! Спасибо, что учитываешь пожелания и рекомендации подписчиков.
Короче, 3 день сижу с твоим уроком, шикарно, спасибо, у нас все было на фласке и 1.4 Алхимии, старым пидантиком, и старым питоном 3.10. Спасибо тебе огромное, это невероятно помогло оформитьв голове план миграции, на фастапи и новые библиотеки
У тебя лучший курс по фаст апи на Ютубе. Сразу видно, что ты не просто прочитал документацию по фаст апи и записал курс, как минимум по тому, что ты знаешь, что f строка быстрее str(). Если было бы поменьше воды, то курс был бы идеален
У тебя прекрасные видео, как вводные. В свое время меня очень испугала документация алхимии, а сейчас стал вопрос как строить бэкенд, который и на МЛ завязан, и вот все внимание сейчас ушло к пайтону, который я просто забросил. Вот отличные вводные, чтобы что-то попробовать с тобой собрать, получить базовую ментальную карту и дальше двигаться Видосы у тебя мего огромные, это большая работа в такой Ютьюб опенсорс, спасибо!
Прикинь, уже пишу первый микросервис (шлюз на FastAPI) за зп, в частности благодаря тебе! Спасибо тебе за труд!!! 🙏 4ый раз пересматриваю, уже почти наизусть выучил все, долго настраивать основу проекта конечно😅
@@SurenKhorenyan привет! Я закончил тот набросок, он пока не в продовом состоянии, умный дядя не переписывал, но т.к. это чисто мое авторосто, я могу тебе скинуть, как идею для обучалки по FastAPI типа в комплексе с httpx асинхронным Плюс, если понравится, могу дальнейшими идеями использования поделиться, я под работу по принципу RAG хаб писал для множественного подключения ИИ. Типа чисто идея от меня тебе, на безвозмездной основе, даже можно и нужно по фактам разнести, что где не так, я не против :) мне только на пользу Сразу на первых парах скажу: Тупо requirements (без poetry), неиспользования форматтеров и куча мелочей еще по упрощению - требование Лида по «не усложнению проекта» По проекту в целом не хочу и не могу пока рассказывать особо, в личку напишу, если интересно 😊
Спасибо за видео, оч полезно. Ты сказал на 46:17 про монорепозиторий, и .env для каждого микросервиса в своем каталоге. А если 2 микросервиса и больше, как считаешь, какая бест практика по установке пакетов для каждого микросервиса? Переходить на pip requir*.txt для каждого микросервиса или в pyproject делать группы или extra для каждого микросервиса или что-то иное?
Здравствуйте, Сурен, спасибо за прекрасное видео. Подскажите пожалуйста, при такой структуре файлов как у вас куда сложить папку с тестами? Куда не положу возникает ошибка с импортами, буду благодарен если скините ссылку на пример репозитория с тестами
@@АндрейТарев-т7б здравствуйте. Пожалуйста! Папку с тестами кладите в корень приложения, то есть тут в fastapi-base-app По ошибкам можем подсказать в телеграм чате, приходите
Привет. Не могу понять суть проблемы. Контейнер с базой понимается, но есть нюанс, не создаёт все до конца. Судя по всему не создаёт базу и пользователя, так как появляется ошибка что такой то пользователь не прошёл валидацию. Ребята есть соображения?
[28P01] FATAL: password authentication failed for user "user Ничего не менял, делал пошагово как на видео. Меняю пароль на 'password', все равно эта же ошибка, в чем причина может быть?
Как работает бд и докер? По идее если нет такой бд создано локально, то докер компоуз создаст ее. Но у меня получаеться пишет, что такой бд с таким именем не существует. Как вообще такое возможно? Код полностью склонирован, только сменила юзера бд.
Merci! Использую SQLAlchemy, потому что её используют и знают везде. SQLModel это скорее демонстрация "смотрите, как ещё можно", но реальных проектов с SQLModel я до сих пор не видел, хотя уже несколько лет с выпуска прошло.
Привет, Сурен Знаком с тобой больше года почти!) Благодаря твоим видео уловил принципы Django и далее нашел самостоятельно пути развития и устроился Джуном) Сейчас уж больно понравилось расширение для пуша в гит с одного файла, но с выбором изменений, не подскажешь есть ли такое же расширение для vs code?
Привет. Круто! Вы большой молодец. Вы про какое расширение? В PyCharm и в VS Code встроенная работа с git. Я через него и работаю. Нет опции выбрать, какие изменения пушить. Если вы про переписывание истории, то я это сделал за кадром, чтобы не грузить зрителей
Привет, пожалуйста! Ставьте как показал в видео и не парьтесь. Реальные значения надо получать опытным путём на конкретном проекте: давать нагрузку и смотреть, что и как происходит
Сурен, спасибо за видео, кое что новое подчерпнул, да еще и есть готовая адеватная структура для будущих проектов. 🤝. А тебя не бесит, когда в ответе id отображается внизу?) Особенно когда большая json’ина.
Круто, пожалуйста! Нет, не бесит, а почему должно бесить? JSON объект не требует упорядочивания. Да и код этот читает компьютер, мы с вами изредка его видим. Но если вам нужно, чтобы id был в начале, добавьте его в Out / Read модель над остальными свойствами
Привет. В ближайшее время не планирую. Можете заказать тему через подписку с уровнем Профессионал на бусти. Но там уже очередь на июнь, так что даже если сейчас оформите, будет не раньше июля или даже августа.
Все хочется выучить и начать пользоваться FastAPI, но как же сильно отпугивает эта вся ручная настройка alembic/sqlalchemy... Как же все удобно и для людей сделано в джанго...
Да, в Джанго очень удобно и легко, особенно поначалу. Вот для фастапи можете взять код из видео (ссылка на репозиторий в описании), и дальше делать всё что вам нужно
Просто легенда ютуба --- Нужен видос про правильное логирование ювикорна. Стандартное оно никакое, а как сделать красиво и правильно(!) очень мало информации
Привет, отличный контент, особенно нравится подробное объяснение различных тонкостей и нюансов) Есть 2 вопроса: 1. Объект для переменной db из класса Settings инициализируется неявно за счёт использования model_config и env файла, в котором определено значение для url, ведь по сути нигде явного присваивания не было? 2. В своей коммерческой деятельности ты используешь такую же архитектуру при написании микросервисов? Неоднократно встречал дискуссии на тему применения различных архитектурных подходов при построении микросервисов, но сам в теме плохо разбираюсь...
кол-во прокидываний APIRouter через __init__.py просто зашкаливает.. На каком-то этапе я так запутался в этой последовательности, что просто решил это все снести и сделать по нормульному.. Но в целом спасибо за подробный и качественный обзор.
@@SurenKhorenyan Заставил себя еще раз внимательно просмотреть материал и разобрался более детально с твоей файловой системой проекта. В конечном итоге получилось все настроить так, как у тебя лишь с незначительными изменениями вложенностей. К примеру, папку models вынес из core на уровень выше, как отдельную директорию и ряд других незначительных, лично для меня, улучшений. Спасибо еще раз, Сурен.
по умолчанию у тебя должен быть postgres как пользователь либо создай нового через терминал psql -U postgres далее CREATE USER user WITH PASSWORD 'password'; пароль сам придумай
Сурен, спасибо за видео, увидел много новых моментов. Сними, пожалуйста, продолжение этого видео где ты настроил бы unt test этого api с разворачиванием базы, добавлением тестовых записей до теста и удалением тестовой базы по завершению тестов. Спасибо.
@@SurenKhorenyan, хирург профессионал сделает аппендэктомию обычным перочинным или столовым ножом. Я, по основной профессии хирург и мне много лет, больше чем Вам. Но... Много сред и IDE я поюзал, в программировании с 12 лет... Тогда и понятий таких не было. И могу однозначно констатировать, что PyCharm не лучшее решение. Ну несомненно это моё ИМХО.. И я же знаю, что Вы в курсе)))... Есть, реально более гибкое и удобное решение для питонистов. А в общем, Вы реально молодец! Смотрю Ваши видео с удовольствием! Python вы знаете. Удачи, коллега!
Спасибо! И какие у вас инструменты для работы (не хирургом)? Я перепробовал много сред и редакторов, остановился на PyCharm по совокупности факторов, но все они сводятся к "просто удобнее"
@@SurenKhorenyan Сурен, а Вы не будете против, если я ближайшее время отвечу Вам в лс в Телеграмм? Просто youtube комментарии не совсем, наверное, правильное место для подобной беседы. У каждого разработчика ведь свои, ему удобные мотивы выбора среды или редактора. Я, кстати, переосмыслил свой первый комментарий... Думаю, что не совсем прав был.
Класс, спасибо! Рад, что вам понравилось 🥰 А как вы себе представляете версионирование? Новые поля добавляем, старые не меняем и не удаляем. Если меняется структура, то делаем папку по аналогии с api_v1, только называем api_v2, и внутри всё по новой. У вас какие-то сложности есть?
@@SurenKhorenyan я с php+фреймворк переезжаю. там эта задача состоит из 2 моментов: 1. Как лучше разложить по папкам контроллеры (в терминах mvc) 2. Как настроить роутер что б было меньше писанины. Обычно я завожу папку modules. В ней подпапки с версиями (v1,v2,v2_1), которые через конфиг фреймворка подтягиваются в роутер. Как версионирую: В папке v1/controllers/UserController.php лежит первая версия контроллера. В папке v2/controllers/UserController.php лежит отнаследованный от v1/controllers/UserController.php контроллер, с перегрузками экшенов которые надо поменять в данной версии. А тут как лучше это организовать?
@@Dikodance В питоне тоже можно делать наследование. Но, вероятно, опыт из другого языка и фреймворка лучше 1в1 не тащить в другой. Посмотрите как это делается в новом. И нужно ли вам тащить все эти версии сразу?
@@SurenKhorenyan я это понимаю. поэтому и спрашиваю. Тут вообще помоему не получится такая логика. Если скажем есть файл v1/users с функцией: @app.get("v1/items") async def read_items(request: Request) ... @app.get("v1/admins") async def read_items(request: Request) ... и в v2/users мне надо перегрузить только /admins то префикс у роута @app.get("v1/items") то не поменяется в новом классе автоматом.
Спасибо! Крутой ролик) Все делал по гайду, но во время миграции вылезает ошибка: asyncpg.exceptions.InvalidPasswordError: password authentication failed for user "user". Создавал новые контейнеры, скачивал репо заново, но ничего не помогает( В чем может быть причина?
Пожалуйста! Скорее всего дело в неправильном пароле. Попробуйте грохнуть (удалить) контейнер и запустить заново. Убедитесь, что в конфиге для приложения правильный пароль указан в нужном файле
Дружище, автор, сделай пожалуйста видео по работе с гитом на Pycharm. Базовые вещи, то понятно, но интересно, посмотреть как искключать файлы из коммитов, пока не понял тему сквошев, так же как удалить все коммиты, оставив последний с последним кодом и тд. Пока не было времени разобраться досконально. Спасибо.
Приветствую, Сурен! Спасибо за ваш труд. Иду по вашим шагам в настройке своего базового проекта и наткнулся на проблему в моменте, когда вы показываете манипуляции с переменным окружением (__48_мин__). При настройке: model_config = SettingsConfigDict( env_file=(".env.template", ".env"), case_sensitive=False, env_nested_delimiter="__", env_prefix="APP_CONFIG__", ) Пытаюсь запустить свое приложение выходит следующая ошибка: File "D:\_projects\fastApi_base_app\app\main.py", line 6, in from core.config import settings File "D:\_projects\fastApi_base_app\app\core\config.py", line 66, in settings = Settings() ^^^^^^^^^^ File "D:\_projects\fastApi_base_app\.venv\Lib\site-packages\pydantic_settings\main.py", line 144, in __init__ super().__init__( File "D:\_projects\fastApi_base_app\.venv\Lib\site-packages\pydantic\main.py", line 193, in __init__ self.__pydantic_validator__.validate_python(data, self_instance=self) pydantic_core._pydantic_core.ValidationError: 1 validation error for Settings db Field required [type=missing, input_value={}, input_type=dict] For further information visit errors.pydantic.dev/2.8/v/missing У вас была такое же предупреждение до настройки model_config. Помогите советом почему у меня settings ругается на отсутствие аргумента.
@@АлександрБамбуляк-з3х привет! Возможно, дело в расположении файлов. Приходите в телеграм чат, с удовольствием подскажем. Тут неудобно совсем разбирать код
А в чём противоречие? Если речь про from_attributes, я рассказываю как раньше было. Для тех, кто понимает боль, показанный пример актуален. Остальным по барабану, и можно не писать лишний код. Или вы про что-то другое?
Если вас смущает, можете просто в каждом модуле, где нужно взять настойки, инициализировать экземпляр настроек заново. Только зачем? Что вы так сэкономите, какую проблему решите? Лишняя работа и только
@@SurenKhorenyan Привет спасибо за труд! а если создать функцию get_settings() под декоратором lru_cache? Я не в коем случае не хочу умничать)) Просто порой бывает сложно понять как лучше сделать(видел множство примеров и часто люди делают по разному), без функции выглядит лаконичнее))
@@MaximShandruk так можно сделать (технически да, я такое даже встречал в продакшне). Только зачем? А итоге всё равно будет один и тот же экземпляр, только его ещё и получать нужно будет через функцию, а не через готовую переменную. Лишняя работа, которая ничему не помогает
Сделал сборку параметра URL DB в конфигах через проперти атрибут. Насколько так ок делать, и есть ли лучше подход? ``` class DatabaseConfig(BaseModel): host: str = "localhost" port: int = 5432 database: str = '' user: str = '' password: str = '' @property def url(self) -> PostgresDsn: return f"postgresql+asyncpg://{self.user}:{self.password}@{self.host}:{self.port}/{self.database}" ```
Теперь я усваиваю на 200% лучше. Синхронизация произошла!!! Такая подача - спокойный обычный разговор - the best! Спасибо, что учитываешь пожелания и рекомендации подписчиков.
Кайф! Рад, что вы оценили! Супер, буду продолжать совершенствоваться 🥰
на скорости 2х вообще будет 400%😂
Хааа 😅
Сурен, досмотрел Ваш очередной ролик, не зря время потрачено. Ну и как всегда - отсутствие воды и много полезных технических нюансов! Так держать!
Круто, спасибо! Очень приятно, очень рад, что вам понравилось 🥰
Превосходная подача материала! Всё подробно и в то же время ничего лишнего. Преподавать ваше призвание! Спасибо за курс.
Пожалуйста! Очень приятно, спасибо 🥰😊
Спасибо!
Пожалуйста!
И вам огромное спасибо 🥰🥰🥰
Короче, 3 день сижу с твоим уроком, шикарно, спасибо, у нас все было на фласке и 1.4 Алхимии, старым пидантиком, и старым питоном 3.10. Спасибо тебе огромное, это невероятно помогло оформитьв голове план миграции, на фастапи и новые библиотеки
Круто! Пожалуйста! Я рад, что смог помочь ☺️
Спасибо, как раз не знала с чего начать, а здесь все, что нужно в одном месте😍
Крутяк, я очень рад, что вам было полезно!
У тебя лучший курс по фаст апи на Ютубе. Сразу видно, что ты не просто прочитал документацию по фаст апи и записал курс, как минимум по тому, что ты знаешь, что f строка быстрее str(). Если было бы поменьше воды, то курс был бы идеален
Без воды он был бы сухим)
Сурен чёткий!
Спасибо! Хаа, а что вы относите к "воде"?
Спасибо!
@@SurenKhorenyan что-то помимо кода, которое является "лирическим отступлением"
Вообще её у Вас(тебя) мало! Вполне сжато и по-делу
@@AHTOH_IO а сваггер это тоже отступление? Там кода нет 😁
Сурен, как всегда на высоте! Спасибо за проделанную работу!
Кайф, пожалуйста!
Сурен, спасибо большое за труды!
Пожалуйста! Рад, что вы оценили
Очень нравится контент твоего канала. Спасибо!
Крутяк, я рад! Пожалуйста!
У тебя прекрасные видео, как вводные. В свое время меня очень испугала документация алхимии, а сейчас стал вопрос как строить бэкенд, который и на МЛ завязан, и вот все внимание сейчас ушло к пайтону, который я просто забросил.
Вот отличные вводные, чтобы что-то попробовать с тобой собрать, получить базовую ментальную карту и дальше двигаться
Видосы у тебя мего огромные, это большая работа в такой Ютьюб опенсорс, спасибо!
Крутяк, пожалуйста! Спасибо огромное! Очень приятно 🥰
Огромное спасибо, круто! Всё понятно, ёмко и по делу
Класс, пожалуйста! Рад 😊
Отличное видео! Спасибо, Сурен!
Пожалуйста! Рад, что вам понравилось!
Вот это кайф! Спасибо огромное!🙏
Пожалуйста! Рад, что понравилось
Огромное спасибо за работу!!!!
Пожалуйста! Очень приятно 🥰
Отлично, сжато, без воды и все самое главное. Еще бы добавить сюда асинхронные тесты. Ну и можно линтеры (ну и black -> ruff)
Спасибо! Согласен, только в такой ролик пока не влезает 😁
Спасибо, то что надо для быстрого старта. 🏁
Кайф, пожалуйста! 🥰
Спасибо! Именно это сейчас мне нужно))
Огонь! Пожалуйста!
Спасибо за этот топик, очень круто!
Пожалуйста! Рад, что вам понравилось 🥰
Отличное видео, спасибо за контент!
Пожалуйста! Рад, что понравилось 😊
Классное видео, подача супер.
Пожалуйста!
сразу бросается в глаза что нет типовых «ээ» «аа», складная речь, респект
Кайф! Очень приятно, что вы заметили 🥰
Сурен, доброго времени суток, надеюсь это не последнее видео про FastAPI)
Здравствуйте! Точно не последнее
круто, подробно объясняешь, спасибо
Кайф, я рад, что вам понравилось! пожалуйста
Вот этот видеоурок больше похож на основу frameworka Fast api чем предыдущие. Спасибо за труд и уделения времени
Пожалуйста!
Прикинь, уже пишу первый микросервис (шлюз на FastAPI) за зп, в частности благодаря тебе!
Спасибо тебе за труд!!! 🙏
4ый раз пересматриваю, уже почти наизусть выучил все, долго настраивать основу проекта конечно😅
@@ivanalexandrovsky1909 крутяк, поздравляю!
@@SurenKhorenyan привет! Я закончил тот набросок, он пока не в продовом состоянии, умный дядя не переписывал, но т.к. это чисто мое авторосто, я могу тебе скинуть, как идею для обучалки по FastAPI типа в комплексе с httpx асинхронным
Плюс, если понравится, могу дальнейшими идеями использования поделиться, я под работу по принципу RAG хаб писал для множественного подключения ИИ.
Типа чисто идея от меня тебе, на безвозмездной основе, даже можно и нужно по фактам разнести, что где не так, я не против :) мне только на пользу
Сразу на первых парах скажу:
Тупо requirements (без poetry), неиспользования форматтеров и куча мелочей еще по упрощению - требование Лида по «не усложнению проекта»
По проекту в целом не хочу и не могу пока рассказывать особо, в личку напишу, если интересно 😊
@@ivanalexandrovsky1909 Привет! Если хотите поделиться и получить обратную связь, приходите в телеграм чат 😊
@@SurenKhorenyan договорились 👍
@@SurenKhorenyan а есть там возможность dm писать?
Спасибо за видео, оч полезно. Ты сказал на 46:17 про монорепозиторий, и .env для каждого микросервиса в своем каталоге. А если 2 микросервиса и больше, как считаешь, какая бест практика по установке пакетов для каждого микросервиса? Переходить на pip requir*.txt для каждого микросервиса или в pyproject делать группы или extra для каждого микросервиса или что-то иное?
Смотря как сильно будут разделены ваши микросервисы. Можно для каждого проекта сделать свой отдельный конфиг для зависимостей, угу
Спасибо!
Комент ради комента.
Жду новые видео)
Пожалуйста! Кайф, очень приятно ☺
Дальше - больше 💪
не получается создать конфиг с подмоделью у которой в наименовании api - это глюк pydantic-settings. помогает только переименование.
Ого! А покажите? У меня в примере работает же.. можете в чат в телеграм закинуть пример кода?
Здравствуйте, Сурен, спасибо за прекрасное видео. Подскажите пожалуйста, при такой структуре файлов как у вас куда сложить папку с тестами? Куда не положу возникает ошибка с импортами, буду благодарен если скините ссылку на пример репозитория с тестами
@@АндрейТарев-т7б здравствуйте. Пожалуйста!
Папку с тестами кладите в корень приложения, то есть тут в fastapi-base-app
По ошибкам можем подсказать в телеграм чате, приходите
почему не юзаешь паттерн controller -> service -> repository -> model ?
@@opitral привет! А покажите хороший пример, пожалуйста. И я про это обязательно расскажу
спасибо за материал !
Вы используете copilot в своей ide ?
Пожалуйста!
Нет, не использую. Подсказки встроенные в PyCharm (оффлайн автокомплит)
Лучший! 😁
Крутяк, спасибо!
Подскажите, вы планируете показать как прикрутить pytest к этому всему? Хотелось бы увидеть как делать асинхронное тестирование.
@@babanlive здравствуйте! Про тестирование обязательно ещё будут ролики
Спасибо! А как включить такие подсказки в PyCharm, чтобы он дальнейший код предугадывал?
Это Full Line Completion
ООО так же было бы круто, увидеть твой конфиг на монорепо с несколькими микросервисами, например, добавить в этот сервис по авторизации юзеров
Подумаю, может быть что-то в голову придёт 🙂
01:05 Старт проекта: установка зависимостей и git ве-->к
Спасибо! Поправил
Круто❤
Класс, спасибо!
Привет. Не могу понять суть проблемы. Контейнер с базой понимается, но есть нюанс, не создаёт все до конца. Судя по всему не создаёт базу и пользователя, так как появляется ошибка что такой то пользователь не прошёл валидацию. Ребята есть соображения?
Скорее всего вы поменяли пароль после первого запуска. Грохните базу и попробуйте снова
@@SurenKhorenyan поменял входной порт и все заработало. На 5432 у меня что то висит
Отлично. Обычно тут помогает ребут
[28P01] FATAL: password authentication failed for user "user
Ничего не менял, делал пошагово как на видео.
Меняю пароль на 'password', все равно эта же ошибка, в чем причина может быть?
Спасибо за видео. А как называется эта архитектура? Вообще какая архитектура лучше для fastapi? Что насчет clean архитектуры?
Пожалуйста! Без понятия как называется 😅
Лучше та, с которой вам удобно работать 🙂
Как работает бд и докер? По идее если нет такой бд создано локально, то докер компоуз создаст ее. Но у меня получаеться пишет, что такой бд с таким именем не существует. Как вообще такое возможно?
Код полностью склонирован, только сменила юзера бд.
@@sveterrr сделайте docker compose down -v, чтобы удалить базу, а потом заново поднимите. Создастся с новым конфигом
Suren jan shat lavner apres) bayc mihat senc harc unem xi sqlalchemy ayl voch te sqlModel?
Merci!
Использую SQLAlchemy, потому что её используют и знают везде. SQLModel это скорее демонстрация "смотрите, как ещё можно", но реальных проектов с SQLModel я до сих пор не видел, хотя уже несколько лет с выпуска прошло.
Привет, Сурен
Знаком с тобой больше года почти!)
Благодаря твоим видео уловил принципы Django и далее нашел самостоятельно пути развития и устроился Джуном)
Сейчас уж больно понравилось расширение для пуша в гит с одного файла, но с выбором изменений, не подскажешь есть ли такое же расширение для vs code?
Привет. Круто!
Вы большой молодец.
Вы про какое расширение? В PyCharm и в VS Code встроенная работа с git. Я через него и работаю. Нет опции выбрать, какие изменения пушить. Если вы про переписывание истории, то я это сделал за кадром, чтобы не грузить зрителей
@@SurenKhorenyan Нет, я про возможность не сразу пушить весь файл в гит, а выбирать строки кода через плюсик для пуша
@@SurenKhorenyan Спасибо большое!)
Продолжайте вести ваш канал, у вас здорово получается!)
Для пуша или для коммита? Для коммита просто кликаю напротив строк
Пожалуйста!
Привет, спасибо за видео!
Такой вопрос: Как правильно рассчитать poll_size для engine? И max_connections для postgres?
Привет, пожалуйста!
Ставьте как показал в видео и не парьтесь. Реальные значения надо получать опытным путём на конкретном проекте: давать нагрузку и смотреть, что и как происходит
Какие средние значения у ваших проектах?
@@popcorn_833 я показал как раз те, что обычно использую: 50 и 10 оверфлоу
@@SurenKhorenyanСпасибо!
@@popcorn_833 пожалуйста!
Сурен, спасибо за видео, кое что новое подчерпнул, да еще и есть готовая адеватная структура для будущих проектов. 🤝. А тебя не бесит, когда в ответе id отображается внизу?) Особенно когда большая json’ина.
Круто, пожалуйста!
Нет, не бесит, а почему должно бесить? JSON объект не требует упорядочивания. Да и код этот читает компьютер, мы с вами изредка его видим.
Но если вам нужно, чтобы id был в начале, добавьте его в Out / Read модель над остальными свойствами
Сурен, очень хотелось бы увидеть от тебя что-то подобное, но с реализацией архитектурного паттерна DDD, например.
Привет. В ближайшее время не планирую. Можете заказать тему через подписку с уровнем Профессионал на бусти. Но там уже очередь на июнь, так что даже если сейчас оформите, будет не раньше июля или даже августа.
Все хочется выучить и начать пользоваться FastAPI, но как же сильно отпугивает эта вся ручная настройка alembic/sqlalchemy... Как же все удобно и для людей сделано в джанго...
Да, в Джанго очень удобно и легко, особенно поначалу. Вот для фастапи можете взять код из видео (ссылка на репозиторий в описании), и дальше делать всё что вам нужно
Просто легенда ютуба
---
Нужен видос про правильное логирование ювикорна. Стандартное оно никакое, а как сделать красиво и правильно(!) очень мало информации
@@shasoqa спасибо!
Когда-нибудь и по этой теме будет ролик 🙂
Привет, отличный контент, особенно нравится подробное объяснение различных тонкостей и нюансов)
Есть 2 вопроса:
1. Объект для переменной db из класса Settings инициализируется неявно за счёт использования model_config и env файла, в котором определено значение для url, ведь по сути нигде явного присваивания не было?
2. В своей коммерческой деятельности ты используешь такую же архитектуру при написании микросервисов? Неоднократно встречал дискуссии на тему применения различных архитектурных подходов при построении микросервисов, но сам в теме плохо разбираюсь...
@@Chris-dx7oi привет, спасибо!
1. Это Pydantic settings делает, так и задумано. Автоматическое чтение из файла
2. Да, такого подхода придерживаюсь
Не пойму причину, но если явно не указать название таблицы для User, alembic не добавляет ее. В чем может быть причина?
@@tonyborbozo а откуда будет известно имя таблицы, если вы не укажете?
@@SurenKhorenyan я делаю по вашему мануалу, предполагается что она должна генерироваться методом обозначеном в классе base. Или что то я не так понял?
@@tonyborbozo да, всё верно, имя должно генерироваться. А этого не происходит? По коду можем подсказать в тг чате
@@SurenKhorenyan спасибо. Постараюсь сам понять.
@@tonyborbozo Пожалуйста 😊
кол-во прокидываний APIRouter через __init__.py просто зашкаливает.. На каком-то этапе я так запутался в этой последовательности, что просто решил это все снести и сделать по нормульному.. Но в целом спасибо за подробный и качественный обзор.
@@nto-i7h хах. Такова цена абстракций 😁
А нормально это как? Поделитесь тут или в чате
@@SurenKhorenyan Заставил себя еще раз внимательно просмотреть материал и разобрался более детально с твоей файловой системой проекта. В конечном итоге получилось все настроить так, как у тебя лишь с незначительными изменениями вложенностей. К примеру, папку models вынес из core на уровень выше, как отдельную директорию и ряд других незначительных, лично для меня, улучшений.
Спасибо еще раз, Сурен.
@@nto-i7h пожалуйста!
Рад, что вас было полезно
У кого при подключении к контейнеру с БД ошибка [28P01] FATAL: password authentication failed for user "user", как победили?
Привет! Попробуйте почистить контейнеры и заново запустить. Скорее всего у вас нет такого пользователя или пароля, перепроверьте настройки
по умолчанию у тебя должен быть postgres как пользователь
либо создай нового через терминал
psql -U postgres
далее CREATE USER user WITH PASSWORD 'password';
пароль сам придумай
Сурен, спасибо за видео, увидел много новых моментов. Сними, пожалуйста, продолжение этого видео где ты настроил бы unt test этого api с разворачиванием базы, добавлением тестовых записей до теста и удалением тестовой базы по завершению тестов. Спасибо.
Пожалуйста!
В этом году будет продолжение в каком-то виде
Всё замечательно, только непонятна избыточная любовь в пайчарму)))
Супер!
Нет любви, есть разве что нелюбовь. Просто среды разработки лучше пока тоже не сделали
@@SurenKhorenyan, хирург профессионал сделает аппендэктомию обычным перочинным или столовым ножом. Я, по основной профессии хирург и мне много лет, больше чем Вам. Но... Много сред и IDE я поюзал, в программировании с 12 лет... Тогда и понятий таких не было. И могу однозначно констатировать, что PyCharm не лучшее решение. Ну несомненно это моё ИМХО.. И я же знаю, что Вы в курсе)))... Есть, реально более гибкое и удобное решение для питонистов. А в общем, Вы реально молодец! Смотрю Ваши видео с удовольствием! Python вы знаете. Удачи, коллега!
Спасибо! И какие у вас инструменты для работы (не хирургом)? Я перепробовал много сред и редакторов, остановился на PyCharm по совокупности факторов, но все они сводятся к "просто удобнее"
@@SurenKhorenyan Сурен, а Вы не будете против, если я ближайшее время отвечу Вам в лс в Телеграмм? Просто youtube комментарии не совсем, наверное, правильное место для подобной беседы. У каждого разработчика ведь свои, ему удобные мотивы выбора среды или редактора. Я, кстати, переосмыслил свой первый комментарий... Думаю, что не совсем прав был.
видео супер. Расскажите про версионирование апи. как его лучше организовать
Класс, спасибо! Рад, что вам понравилось 🥰
А как вы себе представляете версионирование?
Новые поля добавляем, старые не меняем и не удаляем. Если меняется структура, то делаем папку по аналогии с api_v1, только называем api_v2, и внутри всё по новой. У вас какие-то сложности есть?
@@SurenKhorenyan я с php+фреймворк переезжаю. там эта задача состоит из 2 моментов:
1. Как лучше разложить по папкам контроллеры (в терминах mvc)
2. Как настроить роутер что б было меньше писанины.
Обычно я завожу папку modules.
В ней подпапки с версиями (v1,v2,v2_1), которые через конфиг фреймворка подтягиваются в роутер.
Как версионирую:
В папке v1/controllers/UserController.php лежит первая версия контроллера.
В папке v2/controllers/UserController.php лежит отнаследованный от v1/controllers/UserController.php контроллер, с перегрузками экшенов которые надо поменять в данной версии.
А тут как лучше это организовать?
@@Dikodance В питоне тоже можно делать наследование. Но, вероятно, опыт из другого языка и фреймворка лучше 1в1 не тащить в другой. Посмотрите как это делается в новом. И нужно ли вам тащить все эти версии сразу?
@@Dikodance кстати, если придёте в чат в телеграм, может быть вам подскажут лучше меня. Там люди с опытом пхп тоже есть
@@SurenKhorenyan я это понимаю. поэтому и спрашиваю. Тут вообще помоему не получится такая логика.
Если скажем есть файл
v1/users с функцией:
@app.get("v1/items")
async def read_items(request: Request)
...
@app.get("v1/admins")
async def read_items(request: Request)
...
и в v2/users мне надо перегрузить только /admins то префикс у роута @app.get("v1/items") то не поменяется в новом классе автоматом.
Спасибо! Крутой ролик)
Все делал по гайду, но во время миграции вылезает ошибка: asyncpg.exceptions.InvalidPasswordError: password authentication failed for user "user". Создавал новые контейнеры, скачивал репо заново, но ничего не помогает(
В чем может быть причина?
Пожалуйста!
Скорее всего дело в неправильном пароле.
Попробуйте грохнуть (удалить) контейнер и запустить заново. Убедитесь, что в конфиге для приложения правильный пароль указан в нужном файле
@@SurenKhorenyan Спасибо, все работает.
Я случайно изменил название .env файла и не заметил )
@@lsd_btw ахаха, бывает
когда уже выйдет фулстэк пример с html/css
Как только так сразу! Ускорить выход роликов на интересующую вас тему можно через бусти 😊
Теперь ждём ролик по litestar)
Ох, возможно. Но это пока не точно
спс
Пжл!
Дружище, автор, сделай пожалуйста видео по работе с гитом на Pycharm. Базовые вещи, то понятно, но интересно, посмотреть как искключать файлы из коммитов, пока не понял тему сквошев, так же как удалить все коммиты, оставив последний с последним кодом и тд. Пока не было времени разобраться досконально. Спасибо.
Привет! Про работу с Гит тоже будет, да 🙂
@SurenKhorenyan супер, то что надо.
Приветствую, Сурен!
Спасибо за ваш труд. Иду по вашим шагам в настройке своего базового проекта и наткнулся на проблему в моменте, когда вы показываете манипуляции с переменным окружением (__48_мин__). При настройке:
model_config = SettingsConfigDict( env_file=(".env.template", ".env"),
case_sensitive=False,
env_nested_delimiter="__",
env_prefix="APP_CONFIG__", )
Пытаюсь запустить свое приложение выходит следующая ошибка:
File "D:\_projects\fastApi_base_app\app\main.py", line 6, in
from core.config import settings
File "D:\_projects\fastApi_base_app\app\core\config.py", line 66, in
settings = Settings()
^^^^^^^^^^
File "D:\_projects\fastApi_base_app\.venv\Lib\site-packages\pydantic_settings\main.py", line 144, in __init__
super().__init__(
File "D:\_projects\fastApi_base_app\.venv\Lib\site-packages\pydantic\main.py", line 193, in __init__
self.__pydantic_validator__.validate_python(data, self_instance=self)
pydantic_core._pydantic_core.ValidationError: 1 validation error for Settings
db
Field required [type=missing, input_value={}, input_type=dict]
For further information visit errors.pydantic.dev/2.8/v/missing
У вас была такое же предупреждение до настройки model_config.
Помогите советом почему у меня settings ругается на отсутствие аргумента.
@@АлександрБамбуляк-з3х привет! Возможно, дело в расположении файлов. Приходите в телеграм чат, с удовольствием подскажем. Тут неудобно совсем разбирать код
1:22:43 - Сурен, а как же дзен Python? "Явное лучше чем не явное"😊
А в чём противоречие? Если речь про from_attributes, я рассказываю как раньше было. Для тех, кто понимает боль, показанный пример актуален. Остальным по барабану, и можно не писать лишний код. Или вы про что-то другое?
Очень смущает использование глобальной переменной settings
Если вас смущает, можете просто в каждом модуле, где нужно взять настойки, инициализировать экземпляр настроек заново. Только зачем? Что вы так сэкономите, какую проблему решите? Лишняя работа и только
@@SurenKhorenyan Привет спасибо за труд! а если создать функцию get_settings() под декоратором lru_cache? Я не в коем случае не хочу умничать)) Просто порой бывает сложно понять как лучше сделать(видел множство примеров и часто люди делают по разному), без функции выглядит лаконичнее))
@@MaximShandruk так можно сделать (технически да, я такое даже встречал в продакшне). Только зачем? А итоге всё равно будет один и тот же экземпляр, только его ещё и получать нужно будет через функцию, а не через готовую переменную. Лишняя работа, которая ничему не помогает
Было бы еще лучьше, если еще по SQL-alchemy и pydantic дали бы бозовые понятия
По алхимии в этом же плейлисте есть несколько видео
Было бы круто если бы ты добавил в этот конфиг pytest
Этим летом будут ещё ролики по тестированию приложения, скорее всего сюда же и добавлю
@@SurenKhorenyan очень жду
А это нормально что сложно усваивать почти все видео Сурена?😅
Если вы всё повторяете сами, пишете код, то должно быть понятно. Что вызывает сложности?
По сравнению с другими авторами на ютубе у вас намного сложно и интересно. Другие показывают так будто это легко
Подчерпнул
@@vandriichuk отлично!
Сделал сборку параметра URL DB в конфигах через проперти атрибут. Насколько так ок делать, и есть ли лучше подход?
```
class DatabaseConfig(BaseModel):
host: str = "localhost"
port: int = 5432
database: str = ''
user: str = ''
password: str = ''
@property
def url(self) -> PostgresDsn:
return f"postgresql+asyncpg://{self.user}:{self.password}@{self.host}:{self.port}/{self.database}"
```
Здравствуйте! Как вариант можно использовать алхимичный URL.create
docs.sqlalchemy.org/en/20/core/engines.html#sqlalchemy.engine.URL.create