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

แชร์
ฝัง
  • เผยแพร่เมื่อ 5 พ.ค. 2024
  • В этом ролике отрефакторим структуру нашего проекта, а также заложим инфрастуктурную базу для тестов и напишем первый из них.
    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

  • @luchanos
    @luchanos  ปีที่แล้ว +9

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

    • @VladislavSoren
      @VladislavSoren 11 หลายเดือนก่อน

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

    • @user-xi9ww1sg3g
      @user-xi9ww1sg3g 3 หลายเดือนก่อน

      Е

  • @DevALine
    @DevALine ปีที่แล้ว

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

  • @DjangoSchool
    @DjangoSchool ปีที่แล้ว +5

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

    • @luchanos
      @luchanos  ปีที่แล้ว

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

  • @valk9819
    @valk9819 ปีที่แล้ว

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

  • @user-ey5ei4ki7r
    @user-ey5ei4ki7r ปีที่แล้ว

    Интересно 👍

  • @user-kt4yy5cf5e
    @user-kt4yy5cf5e ปีที่แล้ว

    кайфанул

  • @elenaromanova2841
    @elenaromanova2841 11 หลายเดือนก่อน

    Thanks!

  • @sergeyzotov6254
    @sergeyzotov6254 ปีที่แล้ว +2

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

  • @user-ur7jp8dh9f
    @user-ur7jp8dh9f ปีที่แล้ว

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

  • @PlagueisMKII
    @PlagueisMKII 10 หลายเดือนก่อน +3

    Для синхронизации тестовой бд с реальной можно использовать такую фикстуру
    @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)
    И не надо будет запариваться с миграциями алембика и создавать папку с ними.

  • @fffffffff6862
    @fffffffff6862 ปีที่แล้ว

    класс

  • @TheVenom20003
    @TheVenom20003 ปีที่แล้ว

    Ура!

  • @TheNoneedname1991
    @TheNoneedname1991 ปีที่แล้ว +8

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

  • @bgs12
    @bgs12 3 หลายเดือนก่อน

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

  • @ivan_inanych
    @ivan_inanych ปีที่แล้ว

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

  • @dedinside6275
    @dedinside6275 ปีที่แล้ว +1

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

  • @Anshegar
    @Anshegar 10 วันที่ผ่านมา +1

    Тут всетаки непонятно как у тебя тесты проходят нормально у меня при попытка сноса таблиц таким образом выдает ошибку
    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 ругается
    Убрал Пул соединений, все зараболтало норм, но тогда корутину нифига не сделать, а раз так то нафиг это надо вообще.

  • @user-ii5yl2fe8v
    @user-ii5yl2fe8v ปีที่แล้ว

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

  • @TheVenom20003
    @TheVenom20003 ปีที่แล้ว

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

  • @saidserbiev4628
    @saidserbiev4628 ปีที่แล้ว

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

    • @vk2591
      @vk2591 ปีที่แล้ว +1

      нужно.

    • @David-yj5kv
      @David-yj5kv 11 หลายเดือนก่อน

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

    • @saidserbiev4628
      @saidserbiev4628 11 หลายเดือนก่อน

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

    • @ruslankrabov6283
      @ruslankrabov6283 8 หลายเดือนก่อน

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

  • @user-dk3sx6xk2u
    @user-dk3sx6xk2u ปีที่แล้ว +1

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

    • @luchanos
      @luchanos  ปีที่แล้ว +2

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

    • @user-dk3sx6xk2u
      @user-dk3sx6xk2u ปีที่แล้ว +2

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

  • @MirorTuy
    @MirorTuy ปีที่แล้ว

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

    • @user-on9he8to9r
      @user-on9he8to9r 3 หลายเดือนก่อน

      Через chocolatey

  • @vitmih380
    @vitmih380 10 หลายเดือนก่อน +1

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

    • @andreymartynov3958
      @andreymartynov3958 10 หลายเดือนก่อน

      Та же беда...

    • @pavelkozlov9420
      @pavelkozlov9420 8 หลายเดือนก่อน

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

  • @harutavetisyan5683
    @harutavetisyan5683 ปีที่แล้ว

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

    • @luchanos
      @luchanos  ปีที่แล้ว

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

  • @Anshegar
    @Anshegar 12 วันที่ผ่านมา

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

    • @luchanos
      @luchanos  11 วันที่ผ่านมา +1

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

  • @NikolaShoOtNik
    @NikolaShoOtNik หลายเดือนก่อน

    Прошу помощи. Не могу понять почему при запуске теста (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 12 วันที่ผ่านมา

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

  • @user-dg4rg3rk7k
    @user-dg4rg3rk7k ปีที่แล้ว +1

    Подскажите, почему у меня тест валится с ошибкой 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 ปีที่แล้ว +3

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

  • @antonzuzlov2046
    @antonzuzlov2046 ปีที่แล้ว +1

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

    • @luchanos
      @luchanos  ปีที่แล้ว

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

  • @gvadellupa9335
    @gvadellupa9335 ปีที่แล้ว

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

  • @fannigurt
    @fannigurt ปีที่แล้ว +1

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

    • @luchanos
      @luchanos  ปีที่แล้ว

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

  • @TheVenom20003
    @TheVenom20003 ปีที่แล้ว

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

    • @luchanos
      @luchanos  ปีที่แล้ว

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

  • @borismish3017
    @borismish3017 ปีที่แล้ว +2

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

    • @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 никакого ты не показал по сути, но если это прям для новичков, то Сойдет