УРОКИ FASTAPI НА БОЕВОМ СЕРВИСЕ 2. РЕФАКТОРИНГ СТРУКТУРЫ ПРОЕКТА, НАПИСАНИЕ ПЕРВОГО ТЕСТА

В этом ролике отрефакторим структуру нашего проекта, а также заложим инфрастуктурную базу для тестов и напишем первый из них.
00:00 Введение
01:00 Чем займемся в этом ролике?
02:35 Как изменилась структура проекта
08:00 Использование Depends для получения объекта для работы с БД в рамках запроса
13:03 Добавление инстанса тестовой БД в docker-compose файл
15:05 Makefile для управления контейнерами
18:30 Дебаг Depends
20:50 Написание файла conftest для тестов
40:20 Написание теста на хэндлер создания пользователя
46:25 Пытаемся поломать тесты
48:25 Заключение
Поддержать:
www.donationalerts.com/r/luch...
boosty.to/luchanos
На других платформах:
/ luchanos
/ @luchanos
Ссылка на проект - github.com/luchanos/luchanos_...
Канал «luchanos | Balabol IT» в Телеге - t.me/balabol_it
Присоединяйся к нашему чату в Телеге - t.me/luchanos_live_chat
Я в linkedin - www.linkedin.com/in/luchanos
Страница компании - / luchanos
Репозиторий-сокровищница - github.com/luchanos/treasury
#ityoutubers #ityoutubersru

Пікірлер: 69

  • @DjangoSchool
    @DjangoSchool Жыл бұрын

    Супер. Лайк, подписка🙂

  • @luchanos

    @luchanos

    Жыл бұрын

    Спасибо, Миша!!

  • @luchanos
    @luchanos Жыл бұрын

    Актуальный хэш коммита - 2e719cacb228d118c78c444caec2d284a22e4e4a ВНИМАНИЕ! Если будете воспроизводить у себя, то обязательно клонируйте мой репозиторий и обратите внимание на файл requirements.txt - там могут быть зависимости, про которые я не упомянул в ролике, нужно будет их поставить через pip install -r requirements.txt

  • @VladislavSoren

    @VladislavSoren

    Жыл бұрын

    Отличное видео Не забывайте пожалуйста указывать хэш актуального коммита в описании к видео 😄

  • @user-xi9ww1sg3g

    @user-xi9ww1sg3g

    4 ай бұрын

    Е

  • @sergeyzotov6254
    @sergeyzotov6254 Жыл бұрын

    Спасибо за твой труд!

  • @DevALine
    @DevALine Жыл бұрын

    Спасибо за видео👍

  • @valk9819
    @valk9819 Жыл бұрын

    АйТиБалабол) продолжение надо) очень классный материал могу в опенсорс писать тесты)

  • @TheNoneedname1991
    @TheNoneedname1991 Жыл бұрын

    Лучшее что я видел по Fastapi !

  • @user-ey5ei4ki7r
    @user-ey5ei4ki7r Жыл бұрын

    Интересно 👍

  • @user-kt4yy5cf5e
    @user-kt4yy5cf5e Жыл бұрын

    кайфанул

  • @user-ii5yl2fe8v
    @user-ii5yl2fe8v Жыл бұрын

    Дойдут руки до фастапи, внительно изучу твой материал, Коль. Спасибо за твой труд!

  • @elenaromanova2841
    @elenaromanova2841 Жыл бұрын

    Thanks!

  • @TheVenom20003
    @TheVenom20003 Жыл бұрын

    Ура!

  • @user-ur7jp8dh9f
    @user-ur7jp8dh9f Жыл бұрын

    Ждём ещё видео

  • @fffffffff6862
    @fffffffff6862 Жыл бұрын

    класс

  • @ivan_inanych
    @ivan_inanych Жыл бұрын

    В очередной раз актуалочка подъехала

  • @bgs12
    @bgs125 ай бұрын

    Спасибо за отличный ролик. Скачал код. Но без подсказки в комментах, что надо использовать pytest-asyncio==0.18.3 не мог запустить

  • @TheVenom20003
    @TheVenom20003 Жыл бұрын

    Разве в функции get_db , допустим на 5:33 не вылезет ошибка в случае если на 22 строки не удастся создать сессию Тогда в блоке finally же session не определен Или как ?

  • @dedinside6275
    @dedinside6275 Жыл бұрын

    20:30 почему тут не сделать 'async with async_session() as session: yield session' ?

  • @Anshegar
    @Anshegar2 ай бұрын

    Тут всетаки непонятно как у тебя тесты проходят нормально у меня при попытка сноса таблиц таким образом выдает ошибку E sqlalchemy.exc.ArgumentError: Textual SQL expression 'TRUNCATE TABLE users' should be explicitly declared as text('TRUNCATE TABLE users') а если пробовать через SQL Alchemy Text() то как ты и говорил начинается какаято херня с лупами. У меня есть подозрение что пичарм сам както загоняет в pytest эту строку в обход нытью SQLAlchemy, что через командную строку добится не получается, если через text() вводить то лупы залупываются ), а если без то SQL ругается Убрал Пул соединений, все зараболтало норм, но тогда корутину нифига не сделать, а раз так то нафиг это надо вообще.

  • @MirorTuy
    @MirorTuy Жыл бұрын

    Подскажите нормальный способ юзать Makefile на винде. Пробовал через WSL Ubundu - не получается запускать из консоли винды Makefile. На форумах говорят что проблема не решаема. Если есть идеи, напишите пожалуйста, буду благодарен!

  • @user-on9he8to9r

    @user-on9he8to9r

    5 ай бұрын

    Через chocolatey

  • @vitmih380
    @vitmih380 Жыл бұрын

    Ребят, подскажите плиз, почему миграции не создаются в папке tests после первого запуска тестов? Ругается , Directory migrations already exists and is not empty

  • @andreymartynov3958

    @andreymartynov3958

    Жыл бұрын

    Та же беда...

  • @pavelkozlov9420

    @pavelkozlov9420

    10 ай бұрын

    Попробуй: from sqlalchemy import text, а потом TRUNCATE заверни в него - await session.execute(text(f'TRUNCATE TABLE {table};'))

  • @user-dk3sx6xk2u
    @user-dk3sx6xk2u Жыл бұрын

    Для асинхронных фикстур существует декоратор pytest_asyncio в одноименной библиотеке

  • @luchanos

    @luchanos

    Жыл бұрын

    это уже прошлый век - можно использовать конфиг файл где указать что все по умолчанию асинхронное) в 3м видео я про это рассказываю)

  • @user-dk3sx6xk2u

    @user-dk3sx6xk2u

    Жыл бұрын

    @@luchanos спасибо за информацию)

  • @saidserbiev4628
    @saidserbiev4628 Жыл бұрын

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

  • @vk2591

    @vk2591

    Жыл бұрын

    нужно.

  • @David-yj5kv

    @David-yj5kv

    Жыл бұрын

    фастапи вряд ли стоит. Как успехи?

  • @saidserbiev4628

    @saidserbiev4628

    Жыл бұрын

    @@David-yj5kv забросил из за работы и ряда других причин

  • @ruslankrabov6283

    @ruslankrabov6283

    10 ай бұрын

    слабенько.@@saidserbiev4628

  • @Anshegar
    @Anshegar2 ай бұрын

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

  • @luchanos

    @luchanos

    2 ай бұрын

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

  • @PlagueisMKII
    @PlagueisMKII11 ай бұрын

    Для синхронизации тестовой бд с реальной можно использовать такую фикстуру @pytest.fixture(autouse=True, scope='session') async def prepare_database(): async with test_engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) yield async with test_engine.begin() as conn: await conn.run_sync(Base.metadata.drop_all) И не надо будет запариваться с миграциями алембика и создавать папку с ними.

  • @NikolaShoOtNik
    @NikolaShoOtNik3 ай бұрын

    Прошу помощи. Не могу понять почему при запуске теста (Pycharm, Win10, Postgres из докера, как в примере) запись нового пользователя происходит в боевую базу "postgres"😑 вместо "postgres_test". Соответственно после теста "assert len(users_from_db) == 1" тест крашается. В тестовой базе тестовый пользак не появляется. UPDATE. Пытался развернуть клубок, и понял только, что как-то криво работают у меня Depends/Dependency ("app.dependency_overrides[get_db] = _get_test_db"), т.к. при смене базы в самой get_db на TEST_DATABASE_URL - тест срабатывает, и код из теста, кнчн же, пишется в тестовую базу... Подскажите куда дальше копать?

  • @dmitry-lz1ny

    @dmitry-lz1ny

    2 ай бұрын

    У меня ещё была подобная проблема, но немного не то. Почему то докер композ криво грузил .env. То есть грузил старые переменные окружения. Запустил из под wsl, а там все отлично. Короче винда докер иногда сбоит

  • @gvadellupa9335
    @gvadellupa9335 Жыл бұрын

    Кажется, логичнее models и migrations перенести в db

  • @harutavetisyan5683
    @harutavetisyan5683 Жыл бұрын

    Все таки не понятно. Почему yield session а не return. Тогда finally сработает сразу что ли?

  • @luchanos

    @luchanos

    Жыл бұрын

    Нет, чтобы часть кода запустилась до, а часть после yield. Советую почитать как работают генераторы

  • @user-dg4rg3rk7k
    @user-dg4rg3rk7k Жыл бұрын

    Подскажите, почему у меня тест валится с ошибкой resp = client.post("/user/", data=json.dumps(user_data)) E AttributeError: 'async_generator' object has no attribute 'post' Вроде всё проверил, всё как в видео

  • @luchanos

    @luchanos

    Жыл бұрын

    Я оставил хэш коммита под видео, можно попробовать клонировать мой репо и там запустить. И кажется там надо await сделать

  • @user-dg4rg3rk7k

    @user-dg4rg3rk7k

    Жыл бұрын

    @@luchanosтам у меня ваще жесть - все 24 теста валятся. Обидно, ручками писал, а ничего не работает

  • @user-dg4rg3rk7k

    @user-dg4rg3rk7k

    Жыл бұрын

    Ещё есть идеи? Откуда вообще у client берется метод post?

  • @aliaskarisakov1147

    @aliaskarisakov1147

    Жыл бұрын

    @@user-dg4rg3rk7k та же проблема, как найдете решение пните пожалуйста i.kym-cdn.com/photos/images/newsfeed/001/450/453/464.jpg

  • @aliaskarisakov1147

    @aliaskarisakov1147

    Жыл бұрын

    ​@@user-dg4rg3rk7k попробуйте использовать версию pytest-asyncio==0.18.3

  • @antonzuzlov2046
    @antonzuzlov2046 Жыл бұрын

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

  • @luchanos

    @luchanos

    Жыл бұрын

    Спасибо! Думал что добавил. А теперь и правда добавил в описание) Ссылка на проект - github.com/luchanos/luchanos_oxford_university

  • @fannigurt
    @fannigurt Жыл бұрын

    старая алхимия 🧑‍💻, DAL это про архитектуру это типо слой, DAO это про имплементацию, поэтому UserDAO

  • @luchanos

    @luchanos

    Жыл бұрын

    Спасибо! Учту

  • @TheVenom20003
    @TheVenom20003 Жыл бұрын

    А как тут комментарии 5 дней назад вышли , если видео вчерашнее ?

  • @luchanos

    @luchanos

    Жыл бұрын

    это комментарии от подписчиков-спонсоров с бусти уровня Code Reviewer и выше - для них вся отложка открыта. И те, кто покупает отложенный контент разовыми микродонатами)

  • @borismish3017
    @borismish3017 Жыл бұрын

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

  • @luchanos

    @luchanos

    Жыл бұрын

    Потому что я привык видеть данные в базе во время тестов

  • @xewuss3750

    @xewuss3750

    Жыл бұрын

    Например, кто-нибудь может перепутать переменную `DB_NAME` и тесты пойдут на продуктовой базе. И, кстати, потратил 2 дня, чтоб сдружить pytest, alembic, sqlalchemy2, docker. Pасскажите пожалуйста, как обойтись без alembic? Конкретный вопрос был в автоматическом создании триггеров, которые прописаны в миграциях. Base.metadata.create_all не справляется. ПС. Для приложения из видео оно, конечно, бы подощло, но если урок затрагивает более глубокие проблемы - так даже лучше.

  • @luchanos

    @luchanos

    Жыл бұрын

    @@xewuss3750 чтобы таких ситуаций не происходило на базе обязана стоять защита - read only со всех хостов, которые не в специальном списке. Ещё используют зеркала. Это база) слушай, про алембик я прям сейчас тебе не отвечу, я сам в нем не сильно опытный, разбираюсь вот. я адепт сырых запросов и мне орм меньше, чем скуэль нравится. уже думал про то, чтобы выпилить всё это дело и перейти на асинкпг))

  • @xewuss3750

    @xewuss3750

    Жыл бұрын

    @@luchanos, с внедрением миграций алембика в тестах вроде разобрался.

  • @arka4443
    @arka4443 Жыл бұрын

    А это урок прям для совсем нешарящих людей? Тут дело в архитектуре, dependency injection никакого ты не показал по сути, но если это прям для новичков, то Сойдет

Келесі