Теперь я усваиваю на 200% лучше. Синхронизация произошла!!! Такая подача - спокойный обычный разговор - the best! Спасибо, что учитываешь пожелания и рекомендации подписчиков.
У тебя лучший курс по фаст апи на Ютубе. Сразу видно, что ты не просто прочитал документацию по фаст апи и записал курс, как минимум по тому, что ты знаешь, что f строка быстрее str(). Если было бы поменьше воды, то курс был бы идеален
Короче, 3 день сижу с твоим уроком, шикарно, спасибо, у нас все было на фласке и 1.4 Алхимии, старым пидантиком, и старым питоном 3.10. Спасибо тебе огромное, это невероятно помогло оформитьв голове план миграции, на фастапи и новые библиотеки
У тебя прекрасные видео, как вводные. В свое время меня очень испугала документация алхимии, а сейчас стал вопрос как строить бэкенд, который и на МЛ завязан, и вот все внимание сейчас ушло к пайтону, который я просто забросил. Вот отличные вводные, чтобы что-то попробовать с тобой собрать, получить базовую ментальную карту и дальше двигаться Видосы у тебя мего огромные, это большая работа в такой Ютьюб опенсорс, спасибо!
Спасибо за видео, оч полезно. Ты сказал на 46:17 про монорепозиторий, и .env для каждого микросервиса в своем каталоге. А если 2 микросервиса и больше, как считаешь, какая бест практика по установке пакетов для каждого микросервиса? Переходить на pip requir*.txt для каждого микросервиса или в pyproject делать группы или extra для каждого микросервиса или что-то иное?
Прикинь, уже пишу первый микросервис (шлюз на FastAPI) за зп, в частности благодаря тебе! Спасибо тебе за труд!!! 🙏 4ый раз пересматриваю, уже почти наизусть выучил все, долго настраивать основу проекта конечно😅
@@SurenKhorenyan привет! Я закончил тот набросок, он пока не в продовом состоянии, умный дядя не переписывал, но т.к. это чисто мое авторосто, я могу тебе скинуть, как идею для обучалки по FastAPI типа в комплексе с httpx асинхронным Плюс, если понравится, могу дальнейшими идеями использования поделиться, я под работу по принципу RAG хаб писал для множественного подключения ИИ. Типа чисто идея от меня тебе, на безвозмездной основе, даже можно и нужно по фактам разнести, что где не так, я не против :) мне только на пользу Сразу на первых парах скажу: Тупо requirements (без poetry), неиспользования форматтеров и куча мелочей еще по упрощению - требование Лида по «не усложнению проекта» По проекту в целом не хочу и не могу пока рассказывать особо, в личку напишу, если интересно 😊
Привет. В ближайшее время не планирую. Можете заказать тему через подписку с уровнем Профессионал на бусти. Но там уже очередь на июнь, так что даже если сейчас оформите, будет не раньше июля или даже августа.
Просто легенда ютуба --- Нужен видос про правильное логирование ювикорна. Стандартное оно никакое, а как сделать красиво и правильно(!) очень мало информации
Привет, Сурен Знаком с тобой больше года почти!) Благодаря твоим видео уловил принципы Django и далее нашел самостоятельно пути развития и устроился Джуном) Сейчас уж больно понравилось расширение для пуша в гит с одного файла, но с выбором изменений, не подскажешь есть ли такое же расширение для vs code?
Привет. Круто! Вы большой молодец. Вы про какое расширение? В PyCharm и в VS Code встроенная работа с git. Я через него и работаю. Нет опции выбрать, какие изменения пушить. Если вы про переписывание истории, то я это сделал за кадром, чтобы не грузить зрителей
Merci! Использую SQLAlchemy, потому что её используют и знают везде. SQLModel это скорее демонстрация "смотрите, как ещё можно", но реальных проектов с SQLModel я до сих пор не видел, хотя уже несколько лет с выпуска прошло.
Привет, отличный контент, особенно нравится подробное объяснение различных тонкостей и нюансов) Есть 2 вопроса: 1. Объект для переменной db из класса Settings инициализируется неявно за счёт использования model_config и env файла, в котором определено значение для url, ведь по сути нигде явного присваивания не было? 2. В своей коммерческой деятельности ты используешь такую же архитектуру при написании микросервисов? Неоднократно встречал дискуссии на тему применения различных архитектурных подходов при построении микросервисов, но сам в теме плохо разбираюсь...
@@SurenKhorenyan, хирург профессионал сделает аппендэктомию обычным перочинным или столовым ножом. Я, по основной профессии хирург и мне много лет, больше чем Вам. Но... Много сред и IDE я поюзал, в программировании с 12 лет... Тогда и понятий таких не было. И могу однозначно констатировать, что PyCharm не лучшее решение. Ну несомненно это моё ИМХО.. И я же знаю, что Вы в курсе)))... Есть, реально более гибкое и удобное решение для питонистов. А в общем, Вы реально молодец! Смотрю Ваши видео с удовольствием! Python вы знаете. Удачи, коллега!
Спасибо! И какие у вас инструменты для работы (не хирургом)? Я перепробовал много сред и редакторов, остановился на PyCharm по совокупности факторов, но все они сводятся к "просто удобнее"
@@SurenKhorenyan Сурен, а Вы не будете против, если я ближайшее время отвечу Вам в лс в Телеграмм? Просто youtube комментарии не совсем, наверное, правильное место для подобной беседы. У каждого разработчика ведь свои, ему удобные мотивы выбора среды или редактора. Я, кстати, переосмыслил свой первый комментарий... Думаю, что не совсем прав был.
кол-во прокидываний APIRouter через __init__.py просто зашкаливает.. На каком-то этапе я так запутался в этой последовательности, что просто решил это все снести и сделать по нормульному.. Но в целом спасибо за подробный и качественный обзор.
Здравствуйте, Сурен, спасибо за прекрасное видео. Подскажите пожалуйста, при такой структуре файлов как у вас куда сложить папку с тестами? Куда не положу возникает ошибка с импортами, буду благодарен если скините ссылку на пример репозитория с тестами
@@АндрейТарев-т7б здравствуйте. Пожалуйста! Папку с тестами кладите в корень приложения, то есть тут в fastapi-base-app По ошибкам можем подсказать в телеграм чате, приходите
Сурен, спасибо за видео, кое что новое подчерпнул, да еще и есть готовая адеватная структура для будущих проектов. 🤝. А тебя не бесит, когда в ответе id отображается внизу?) Особенно когда большая json’ина.
Круто, пожалуйста! Нет, не бесит, а почему должно бесить? JSON объект не требует упорядочивания. Да и код этот читает компьютер, мы с вами изредка его видим. Но если вам нужно, чтобы id был в начале, добавьте его в Out / Read модель над остальными свойствами
Все хочется выучить и начать пользоваться FastAPI, но как же сильно отпугивает эта вся ручная настройка alembic/sqlalchemy... Как же все удобно и для людей сделано в джанго...
Да, в Джанго очень удобно и легко, особенно поначалу. Вот для фастапи можете взять код из видео (ссылка на репозиторий в описании), и дальше делать всё что вам нужно
Класс, спасибо! Рад, что вам понравилось 🥰 А как вы себе представляете версионирование? Новые поля добавляем, старые не меняем и не удаляем. Если меняется структура, то делаем папку по аналогии с 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") то не поменяется в новом классе автоматом.
Приветствую, Сурен! Спасибо за ваш труд. Иду по вашим шагам в настройке своего базового проекта и наткнулся на проблему в моменте, когда вы показываете манипуляции с переменным окружением (__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, я рассказываю как раньше было. Для тех, кто понимает боль, показанный пример актуален. Остальным по барабану, и можно не писать лишний код. Или вы про что-то другое?
Как работает бд и докер? По идее если нет такой бд создано локально, то докер компоуз создаст ее. Но у меня получаеться пишет, что такой бд с таким именем не существует. Как вообще такое возможно? Код полностью склонирован, только сменила юзера бд.
Спасибо! Крутой ролик) Все делал по гайду, но во время миграции вылезает ошибка: asyncpg.exceptions.InvalidPasswordError: password authentication failed for user "user". Создавал новые контейнеры, скачивал репо заново, но ничего не помогает( В чем может быть причина?
Пожалуйста! Скорее всего дело в неправильном пароле. Попробуйте грохнуть (удалить) контейнер и запустить заново. Убедитесь, что в конфиге для приложения правильный пароль указан в нужном файле
Дружище, автор, сделай пожалуйста видео по работе с гитом на Pycharm. Базовые вещи, то понятно, но интересно, посмотреть как искключать файлы из коммитов, пока не понял тему сквошев, так же как удалить все коммиты, оставив последний с последним кодом и тд. Пока не было времени разобраться досконально. Спасибо.
Привет. Не могу понять суть проблемы. Контейнер с базой понимается, но есть нюанс, не создаёт все до конца. Судя по всему не создаёт базу и пользователя, так как появляется ошибка что такой то пользователь не прошёл валидацию. Ребята есть соображения?
[28P01] FATAL: password authentication failed for user "user Ничего не менял, делал пошагово как на видео. Меняю пароль на 'password', все равно эта же ошибка, в чем причина может быть?
по умолчанию у тебя должен быть postgres как пользователь либо создай нового через терминал psql -U postgres далее CREATE USER user WITH PASSWORD 'password'; пароль сам придумай
Если вас смущает, можете просто в каждом модуле, где нужно взять настойки, инициализировать экземпляр настроек заново. Только зачем? Что вы так сэкономите, какую проблему решите? Лишняя работа и только
@@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%😂
Хааа 😅
У тебя лучший курс по фаст апи на Ютубе. Сразу видно, что ты не просто прочитал документацию по фаст апи и записал курс, как минимум по тому, что ты знаешь, что f строка быстрее str(). Если было бы поменьше воды, то курс был бы идеален
Без воды он был бы сухим)
Сурен чёткий!
Спасибо! Хаа, а что вы относите к "воде"?
Спасибо!
@@SurenKhorenyan что-то помимо кода, которое является "лирическим отступлением"
Вообще её у Вас(тебя) мало! Вполне сжато и по-делу
@@AHTOH_IO а сваггер это тоже отступление? Там кода нет 😁
Сурен, досмотрел Ваш очередной ролик, не зря время потрачено. Ну и как всегда - отсутствие воды и много полезных технических нюансов! Так держать!
Круто, спасибо! Очень приятно, очень рад, что вам понравилось 🥰
сразу бросается в глаза что нет типовых «ээ» «аа», складная речь, респект
Кайф! Очень приятно, что вы заметили 🥰
Превосходная подача материала! Всё подробно и в то же время ничего лишнего. Преподавать ваше призвание! Спасибо за курс.
Пожалуйста! Очень приятно, спасибо 🥰😊
Короче, 3 день сижу с твоим уроком, шикарно, спасибо, у нас все было на фласке и 1.4 Алхимии, старым пидантиком, и старым питоном 3.10. Спасибо тебе огромное, это невероятно помогло оформитьв голове план миграции, на фастапи и новые библиотеки
Круто! Пожалуйста! Я рад, что смог помочь ☺️
Огромное спасибо за работу!!!!
Пожалуйста! Очень приятно 🥰
Спасибо, как раз не знала с чего начать, а здесь все, что нужно в одном месте😍
Крутяк, я очень рад, что вам было полезно!
Очень нравится контент твоего канала. Спасибо!
Крутяк, я рад! Пожалуйста!
Сурен, как всегда на высоте! Спасибо за проделанную работу!
Кайф, пожалуйста!
У тебя прекрасные видео, как вводные. В свое время меня очень испугала документация алхимии, а сейчас стал вопрос как строить бэкенд, который и на МЛ завязан, и вот все внимание сейчас ушло к пайтону, который я просто забросил.
Вот отличные вводные, чтобы что-то попробовать с тобой собрать, получить базовую ментальную карту и дальше двигаться
Видосы у тебя мего огромные, это большая работа в такой Ютьюб опенсорс, спасибо!
Крутяк, пожалуйста! Спасибо огромное! Очень приятно 🥰
Отлично, сжато, без воды и все самое главное. Еще бы добавить сюда асинхронные тесты. Ну и можно линтеры (ну и black -> ruff)
Спасибо! Согласен, только в такой ролик пока не влезает 😁
Огромное спасибо, круто! Всё понятно, ёмко и по делу
Класс, пожалуйста! Рад 😊
Сурен, спасибо большое за труды!
Пожалуйста! Рад, что вы оценили
Вот это кайф! Спасибо огромное!🙏
Пожалуйста! Рад, что понравилось
Отличное видео! Спасибо, Сурен!
Пожалуйста! Рад, что вам понравилось!
Спасибо! Именно это сейчас мне нужно))
Огонь! Пожалуйста!
круто, подробно объясняешь, спасибо
Кайф, я рад, что вам понравилось! пожалуйста
Спасибо за этот топик, очень круто!
Пожалуйста! Рад, что вам понравилось 🥰
Спасибо, то что надо для быстрого старта. 🏁
Кайф, пожалуйста! 🥰
Классное видео, подача супер.
Пожалуйста!
Сурен, доброго времени суток, надеюсь это не последнее видео про FastAPI)
Здравствуйте! Точно не последнее
Отличное видео, спасибо за контент!
Пожалуйста! Рад, что понравилось 😊
Вот этот видеоурок больше похож на основу frameworka Fast api чем предыдущие. Спасибо за труд и уделения времени
Пожалуйста!
спасибо за материал !
Вы используете copilot в своей ide ?
Пожалуйста!
Нет, не использую. Подсказки встроенные в PyCharm (оффлайн автокомплит)
Спасибо за видео, оч полезно. Ты сказал на 46:17 про монорепозиторий, и .env для каждого микросервиса в своем каталоге. А если 2 микросервиса и больше, как считаешь, какая бест практика по установке пакетов для каждого микросервиса? Переходить на pip requir*.txt для каждого микросервиса или в pyproject делать группы или extra для каждого микросервиса или что-то иное?
Смотря как сильно будут разделены ваши микросервисы. Можно для каждого проекта сделать свой отдельный конфиг для зависимостей, угу
Спасибо!
Комент ради комента.
Жду новые видео)
Пожалуйста! Кайф, очень приятно ☺
Дальше - больше 💪
Прикинь, уже пишу первый микросервис (шлюз на FastAPI) за зп, в частности благодаря тебе!
Спасибо тебе за труд!!! 🙏
4ый раз пересматриваю, уже почти наизусть выучил все, долго настраивать основу проекта конечно😅
@@ivanalexandrovsky1909 крутяк, поздравляю!
@@SurenKhorenyan привет! Я закончил тот набросок, он пока не в продовом состоянии, умный дядя не переписывал, но т.к. это чисто мое авторосто, я могу тебе скинуть, как идею для обучалки по FastAPI типа в комплексе с httpx асинхронным
Плюс, если понравится, могу дальнейшими идеями использования поделиться, я под работу по принципу RAG хаб писал для множественного подключения ИИ.
Типа чисто идея от меня тебе, на безвозмездной основе, даже можно и нужно по фактам разнести, что где не так, я не против :) мне только на пользу
Сразу на первых парах скажу:
Тупо requirements (без poetry), неиспользования форматтеров и куча мелочей еще по упрощению - требование Лида по «не усложнению проекта»
По проекту в целом не хочу и не могу пока рассказывать особо, в личку напишу, если интересно 😊
@@ivanalexandrovsky1909 Привет! Если хотите поделиться и получить обратную связь, приходите в телеграм чат 😊
@@SurenKhorenyan договорились 👍
@@SurenKhorenyan а есть там возможность dm писать?
ООО так же было бы круто, увидеть твой конфиг на монорепо с несколькими микросервисами, например, добавить в этот сервис по авторизации юзеров
Подумаю, может быть что-то в голову придёт 🙂
Сурен, очень хотелось бы увидеть от тебя что-то подобное, но с реализацией архитектурного паттерна DDD, например.
Привет. В ближайшее время не планирую. Можете заказать тему через подписку с уровнем Профессионал на бусти. Но там уже очередь на июнь, так что даже если сейчас оформите, будет не раньше июля или даже августа.
Просто легенда ютуба
---
Нужен видос про правильное логирование ювикорна. Стандартное оно никакое, а как сделать красиво и правильно(!) очень мало информации
@@shasoqa спасибо!
Когда-нибудь и по этой теме будет ролик 🙂
Привет, Сурен
Знаком с тобой больше года почти!)
Благодаря твоим видео уловил принципы Django и далее нашел самостоятельно пути развития и устроился Джуном)
Сейчас уж больно понравилось расширение для пуша в гит с одного файла, но с выбором изменений, не подскажешь есть ли такое же расширение для vs code?
Привет. Круто!
Вы большой молодец.
Вы про какое расширение? В PyCharm и в VS Code встроенная работа с git. Я через него и работаю. Нет опции выбрать, какие изменения пушить. Если вы про переписывание истории, то я это сделал за кадром, чтобы не грузить зрителей
@@SurenKhorenyan Нет, я про возможность не сразу пушить весь файл в гит, а выбирать строки кода через плюсик для пуша
@@SurenKhorenyan Спасибо большое!)
Продолжайте вести ваш канал, у вас здорово получается!)
Для пуша или для коммита? Для коммита просто кликаю напротив строк
Пожалуйста!
Спасибо за видео. А как называется эта архитектура? Вообще какая архитектура лучше для fastapi? Что насчет clean архитектуры?
Пожалуйста! Без понятия как называется 😅
Лучше та, с которой вам удобно работать 🙂
01:05 Старт проекта: установка зависимостей и git ве-->к
Спасибо! Поправил
Suren jan shat lavner apres) bayc mihat senc harc unem xi sqlalchemy ayl voch te sqlModel?
Merci!
Использую SQLAlchemy, потому что её используют и знают везде. SQLModel это скорее демонстрация "смотрите, как ещё можно", но реальных проектов с SQLModel я до сих пор не видел, хотя уже несколько лет с выпуска прошло.
Привет, отличный контент, особенно нравится подробное объяснение различных тонкостей и нюансов)
Есть 2 вопроса:
1. Объект для переменной db из класса Settings инициализируется неявно за счёт использования model_config и env файла, в котором определено значение для url, ведь по сути нигде явного присваивания не было?
2. В своей коммерческой деятельности ты используешь такую же архитектуру при написании микросервисов? Неоднократно встречал дискуссии на тему применения различных архитектурных подходов при построении микросервисов, но сам в теме плохо разбираюсь...
@@Chris-dx7oi привет, спасибо!
1. Это Pydantic settings делает, так и задумано. Автоматическое чтение из файла
2. Да, такого подхода придерживаюсь
Всё замечательно, только непонятна избыточная любовь в пайчарму)))
Супер!
Нет любви, есть разве что нелюбовь. Просто среды разработки лучше пока тоже не сделали
@@SurenKhorenyan, хирург профессионал сделает аппендэктомию обычным перочинным или столовым ножом. Я, по основной профессии хирург и мне много лет, больше чем Вам. Но... Много сред и IDE я поюзал, в программировании с 12 лет... Тогда и понятий таких не было. И могу однозначно констатировать, что PyCharm не лучшее решение. Ну несомненно это моё ИМХО.. И я же знаю, что Вы в курсе)))... Есть, реально более гибкое и удобное решение для питонистов. А в общем, Вы реально молодец! Смотрю Ваши видео с удовольствием! Python вы знаете. Удачи, коллега!
Спасибо! И какие у вас инструменты для работы (не хирургом)? Я перепробовал много сред и редакторов, остановился на PyCharm по совокупности факторов, но все они сводятся к "просто удобнее"
@@SurenKhorenyan Сурен, а Вы не будете против, если я ближайшее время отвечу Вам в лс в Телеграмм? Просто youtube комментарии не совсем, наверное, правильное место для подобной беседы. У каждого разработчика ведь свои, ему удобные мотивы выбора среды или редактора. Я, кстати, переосмыслил свой первый комментарий... Думаю, что не совсем прав был.
кол-во прокидываний APIRouter через __init__.py просто зашкаливает.. На каком-то этапе я так запутался в этой последовательности, что просто решил это все снести и сделать по нормульному.. Но в целом спасибо за подробный и качественный обзор.
@@nto-i7h хах. Такова цена абстракций 😁
А нормально это как? Поделитесь тут или в чате
Здравствуйте, Сурен, спасибо за прекрасное видео. Подскажите пожалуйста, при такой структуре файлов как у вас куда сложить папку с тестами? Куда не положу возникает ошибка с импортами, буду благодарен если скините ссылку на пример репозитория с тестами
@@АндрейТарев-т7б здравствуйте. Пожалуйста!
Папку с тестами кладите в корень приложения, то есть тут в fastapi-base-app
По ошибкам можем подсказать в телеграм чате, приходите
Сурен, спасибо за видео, кое что новое подчерпнул, да еще и есть готовая адеватная структура для будущих проектов. 🤝. А тебя не бесит, когда в ответе id отображается внизу?) Особенно когда большая json’ина.
Круто, пожалуйста!
Нет, не бесит, а почему должно бесить? JSON объект не требует упорядочивания. Да и код этот читает компьютер, мы с вами изредка его видим.
Но если вам нужно, чтобы id был в начале, добавьте его в Out / Read модель над остальными свойствами
Лучший! 😁
Крутяк, спасибо!
Спасибо, Сделал свой шаблон на базе твоего. Вопрос. Почему ты не используешь фабрику для нициализации app?
@@АнтонМиндлин пожалуйста!
Тут не добрался. В новом ролике (про доступ к документации) сделал отдельную функцию
Круто❤
Класс, спасибо!
Подскажите, вы планируете показать как прикрутить pytest к этому всему? Хотелось бы увидеть как делать асинхронное тестирование.
@@babanlive здравствуйте! Про тестирование обязательно ещё будут ролики
Все хочется выучить и начать пользоваться FastAPI, но как же сильно отпугивает эта вся ручная настройка alembic/sqlalchemy... Как же все удобно и для людей сделано в джанго...
Да, в Джанго очень удобно и легко, особенно поначалу. Вот для фастапи можете взять код из видео (ссылка на репозиторий в описании), и дальше делать всё что вам нужно
видео супер. Расскажите про версионирование апи. как его лучше организовать
Класс, спасибо! Рад, что вам понравилось 🥰
А как вы себе представляете версионирование?
Новые поля добавляем, старые не меняем и не удаляем. Если меняется структура, то делаем папку по аналогии с 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") то не поменяется в новом классе автоматом.
почему не юзаешь паттерн controller -> service -> repository -> model ?
@@opitral привет! А покажите хороший пример, пожалуйста. И я про это обязательно расскажу
Спасибо! А как включить такие подсказки в PyCharm, чтобы он дальнейший код предугадывал?
Это Full Line Completion
Теперь ждём ролик по litestar)
Ох, возможно. Но это пока не точно
не получается создать конфиг с подмоделью у которой в наименовании api - это глюк pydantic-settings. помогает только переименование.
Ого! А покажите? У меня в примере работает же.. можете в чат в телеграм закинуть пример кода?
Приветствую, Сурен!
Спасибо за ваш труд. Иду по вашим шагам в настройке своего базового проекта и наткнулся на проблему в моменте, когда вы показываете манипуляции с переменным окружением (__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х привет! Возможно, дело в расположении файлов. Приходите в телеграм чат, с удовольствием подскажем. Тут неудобно совсем разбирать код
Привет, спасибо за видео!
Такой вопрос: Как правильно рассчитать poll_size для engine? И max_connections для postgres?
Привет, пожалуйста!
Ставьте как показал в видео и не парьтесь. Реальные значения надо получать опытным путём на конкретном проекте: давать нагрузку и смотреть, что и как происходит
Какие средние значения у ваших проектах?
@@popcorn_833 я показал как раз те, что обычно использую: 50 и 10 оверфлоу
@@SurenKhorenyanСпасибо!
@@popcorn_833 пожалуйста!
1:22:43 - Сурен, а как же дзен Python? "Явное лучше чем не явное"😊
А в чём противоречие? Если речь про from_attributes, я рассказываю как раньше было. Для тех, кто понимает боль, показанный пример актуален. Остальным по барабану, и можно не писать лишний код. Или вы про что-то другое?
Как работает бд и докер? По идее если нет такой бд создано локально, то докер компоуз создаст ее. Но у меня получаеться пишет, что такой бд с таким именем не существует. Как вообще такое возможно?
Код полностью склонирован, только сменила юзера бд.
@@sveterrr сделайте docker compose down -v, чтобы удалить базу, а потом заново поднимите. Создастся с новым конфигом
когда уже выйдет фулстэк пример с html/css
Как только так сразу! Ускорить выход роликов на интересующую вас тему можно через бусти 😊
Спасибо! Крутой ролик)
Все делал по гайду, но во время миграции вылезает ошибка: asyncpg.exceptions.InvalidPasswordError: password authentication failed for user "user". Создавал новые контейнеры, скачивал репо заново, но ничего не помогает(
В чем может быть причина?
Пожалуйста!
Скорее всего дело в неправильном пароле.
Попробуйте грохнуть (удалить) контейнер и запустить заново. Убедитесь, что в конфиге для приложения правильный пароль указан в нужном файле
@@SurenKhorenyan Спасибо, все работает.
Я случайно изменил название .env файла и не заметил )
@@lsd_btw ахаха, бывает
Дружище, автор, сделай пожалуйста видео по работе с гитом на Pycharm. Базовые вещи, то понятно, но интересно, посмотреть как искключать файлы из коммитов, пока не понял тему сквошев, так же как удалить все коммиты, оставив последний с последним кодом и тд. Пока не было времени разобраться досконально. Спасибо.
Привет! Про работу с Гит тоже будет, да 🙂
@SurenKhorenyan супер, то что надо.
Привет. Не могу понять суть проблемы. Контейнер с базой понимается, но есть нюанс, не создаёт все до конца. Судя по всему не создаёт базу и пользователя, так как появляется ошибка что такой то пользователь не прошёл валидацию. Ребята есть соображения?
Скорее всего вы поменяли пароль после первого запуска. Грохните базу и попробуйте снова
@@SurenKhorenyan поменял входной порт и все заработало. На 5432 у меня что то висит
Отлично. Обычно тут помогает ребут
[28P01] FATAL: password authentication failed for user "user
Ничего не менял, делал пошагово как на видео.
Меняю пароль на 'password', все равно эта же ошибка, в чем причина может быть?
Не пойму причину, но если явно не указать название таблицы для User, alembic не добавляет ее. В чем может быть причина?
@@tonyborbozo а откуда будет известно имя таблицы, если вы не укажете?
@@SurenKhorenyan я делаю по вашему мануалу, предполагается что она должна генерироваться методом обозначеном в классе base. Или что то я не так понял?
@@tonyborbozo да, всё верно, имя должно генерироваться. А этого не происходит? По коду можем подсказать в тг чате
@@SurenKhorenyan спасибо. Постараюсь сам понять.
@@tonyborbozo Пожалуйста 😊
У кого при подключении к контейнеру с БД ошибка [28P01] FATAL: password authentication failed for user "user", как победили?
Привет! Попробуйте почистить контейнеры и заново запустить. Скорее всего у вас нет такого пользователя или пароля, перепроверьте настройки
по умолчанию у тебя должен быть postgres как пользователь
либо создай нового через терминал
psql -U postgres
далее CREATE USER user WITH PASSWORD 'password';
пароль сам придумай
Было бы круто если бы ты добавил в этот конфиг pytest
Этим летом будут ещё ролики по тестированию приложения, скорее всего сюда же и добавлю
@@SurenKhorenyan очень жду
Было бы еще лучьше, если еще по SQL-alchemy и pydantic дали бы бозовые понятия
По алхимии в этом же плейлисте есть несколько видео
Очень смущает использование глобальной переменной settings
Если вас смущает, можете просто в каждом модуле, где нужно взять настойки, инициализировать экземпляр настроек заново. Только зачем? Что вы так сэкономите, какую проблему решите? Лишняя работа и только
@@SurenKhorenyan Привет спасибо за труд! а если создать функцию get_settings() под декоратором lru_cache? Я не в коем случае не хочу умничать)) Просто порой бывает сложно понять как лучше сделать(видел множство примеров и часто люди делают по разному), без функции выглядит лаконичнее))
@@MaximShandruk так можно сделать (технически да, я такое даже встречал в продакшне). Только зачем? А итоге всё равно будет один и тот же экземпляр, только его ещё и получать нужно будет через функцию, а не через готовую переменную. Лишняя работа, которая ничему не помогает
А это нормально что сложно усваивать почти все видео Сурена?😅
Если вы всё повторяете сами, пишете код, то должно быть понятно. Что вызывает сложности?
По сравнению с другими авторами на ютубе у вас намного сложно и интересно. Другие показывают так будто это легко
спс
Пжл!
Подчерпнул
@@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