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