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

  Рет қаралды 17,890

luchanos

luchanos

Күн бұрын

Пікірлер: 72
@luchanos
@luchanos 2 жыл бұрын
Актуальный хэш коммита - 2e719cacb228d118c78c444caec2d284a22e4e4a ВНИМАНИЕ! Если будете воспроизводить у себя, то обязательно клонируйте мой репозиторий и обратите внимание на файл requirements.txt - там могут быть зависимости, про которые я не упомянул в ролике, нужно будет их поставить через pip install -r requirements.txt
@VladislavSoren
@VladislavSoren Жыл бұрын
Отличное видео Не забывайте пожалуйста указывать хэш актуального коммита в описании к видео 😄
@СуперШок-р1з
@СуперШок-р1з 11 ай бұрын
Е
@DjangoSchool
@DjangoSchool Жыл бұрын
Супер. Лайк, подписка🙂
@luchanos
@luchanos Жыл бұрын
Спасибо, Миша!!
@elenaromanova2841
@elenaromanova2841 Жыл бұрын
Thanks!
@TheNoneedname1991
@TheNoneedname1991 Жыл бұрын
Лучшее что я видел по Fastapi !
@dedinside6275
@dedinside6275 Жыл бұрын
20:30 почему тут не сделать 'async with async_session() as session: yield session' ?
@ondest5059
@ondest5059 2 ай бұрын
Может я че то не понял, но почему именно нужно поднимать второй инстанс посгреса? Внутри первого 2ую дб точно так же создать можно и не нужно дублировать миграции, в остальном просто в конце урла меняете имя базы и все, ради чего все эти костыли? Сначала дропать тестовую базу в фикстуре, а потом накатывать, так даже данные оставаться будут
@sergeyzotov6254
@sergeyzotov6254 2 жыл бұрын
Спасибо за твой труд!
@PlagueisMKII
@PlagueisMKII Жыл бұрын
Для синхронизации тестовой бд с реальной можно использовать такую фикстуру @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) И не надо будет запариваться с миграциями алембика и создавать папку с ними.
@vitmih380
@vitmih380 Жыл бұрын
Ребят, подскажите плиз, почему миграции не создаются в папке tests после первого запуска тестов? Ругается , Directory migrations already exists and is not empty
@andreymartynov3958
@andreymartynov3958 Жыл бұрын
Та же беда...
@pavelkozlov9420
@pavelkozlov9420 Жыл бұрын
Попробуй: from sqlalchemy import text, а потом TRUNCATE заверни в него - await session.execute(text(f'TRUNCATE TABLE {table};'))
@slava_zxz
@slava_zxz 2 ай бұрын
У меня миграции создавались в корне проекта, потому что os.system() открывает cmd в корне проекта. Я это решил заменой: ЭТОГО: ``` os.system(" alembic init migrations") os.system('alembic revision --autogenerate -m "test running migrations”') os.system(" alembic upgrade heads") ``` НА ЭТО: ``` os.system("cd tests & alembic init migrations") os.system('cd tests & alembic revision --autogenerate -m "test running migrations”') os.system("cd tests & alembic upgrade heads") ```
@valk9819
@valk9819 Жыл бұрын
АйТиБалабол) продолжение надо) очень классный материал могу в опенсорс писать тесты)
@Anshegar
@Anshegar 8 ай бұрын
Тут всетаки непонятно как у тебя тесты проходят нормально у меня при попытка сноса таблиц таким образом выдает ошибку 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 ругается Убрал Пул соединений, все зараболтало норм, но тогда корутину нифига не сделать, а раз так то нафиг это надо вообще.
@bgs12
@bgs12 11 ай бұрын
Спасибо за отличный ролик. Скачал код. Но без подсказки в комментах, что надо использовать pytest-asyncio==0.18.3 не мог запустить
@yanabrigadir
@yanabrigadir 3 ай бұрын
спасибо
@DevALine
@DevALine Жыл бұрын
Спасибо за видео👍
@ШефПинкертон
@ШефПинкертон Жыл бұрын
Интересно 👍
@СергейГузун-л6с
@СергейГузун-л6с Жыл бұрын
Дойдут руки до фастапи, внительно изучу твой материал, Коль. Спасибо за твой труд!
@TheVenom20003
@TheVenom20003 Жыл бұрын
Разве в функции get_db , допустим на 5:33 не вылезет ошибка в случае если на 22 строки не удастся создать сессию Тогда в блоке finally же session не определен Или как ?
@ДанилЧерепухин
@ДанилЧерепухин Жыл бұрын
Подскажите, почему у меня тест валится с ошибкой resp = client.post("/user/", data=json.dumps(user_data)) E AttributeError: 'async_generator' object has no attribute 'post' Вроде всё проверил, всё как в видео
@luchanos
@luchanos Жыл бұрын
Я оставил хэш коммита под видео, можно попробовать клонировать мой репо и там запустить. И кажется там надо await сделать
@ДанилЧерепухин
@ДанилЧерепухин Жыл бұрын
@@luchanosтам у меня ваще жесть - все 24 теста валятся. Обидно, ручками писал, а ничего не работает
@ДанилЧерепухин
@ДанилЧерепухин Жыл бұрын
Ещё есть идеи? Откуда вообще у client берется метод post?
@aliaskarisakov1147
@aliaskarisakov1147 Жыл бұрын
@@ДанилЧерепухин та же проблема, как найдете решение пните пожалуйста i.kym-cdn.com/photos/images/newsfeed/001/450/453/464.jpg
@aliaskarisakov1147
@aliaskarisakov1147 Жыл бұрын
​@@ДанилЧерепухин попробуйте использовать версию pytest-asyncio==0.18.3
@TheVenom20003
@TheVenom20003 Жыл бұрын
Ура!
@МаксимАндреев-я1г
@МаксимАндреев-я1г Жыл бұрын
кайфанул
@konstant1n-t8j
@konstant1n-t8j Жыл бұрын
Для асинхронных фикстур существует декоратор pytest_asyncio в одноименной библиотеке
@luchanos
@luchanos Жыл бұрын
это уже прошлый век - можно использовать конфиг файл где указать что все по умолчанию асинхронное) в 3м видео я про это рассказываю)
@konstant1n-t8j
@konstant1n-t8j Жыл бұрын
@@luchanos спасибо за информацию)
@ivan_inanych
@ivan_inanych Жыл бұрын
В очередной раз актуалочка подъехала
@fffffffff6862
@fffffffff6862 Жыл бұрын
класс
@NikolaShoOtNik
@NikolaShoOtNik 9 ай бұрын
Прошу помощи. Не могу понять почему при запуске теста (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 8 ай бұрын
У меня ещё была подобная проблема, но немного не то. Почему то докер композ криво грузил .env. То есть грузил старые переменные окружения. Запустил из под wsl, а там все отлично. Короче винда докер иногда сбоит
@НикитаПетрачков-щ8м
@НикитаПетрачков-щ8м Жыл бұрын
Ждём ещё видео
@MirorTuy
@MirorTuy Жыл бұрын
Подскажите нормальный способ юзать Makefile на винде. Пробовал через WSL Ubundu - не получается запускать из консоли винды Makefile. На форумах говорят что проблема не решаема. Если есть идеи, напишите пожалуйста, буду благодарен!
@ПавелБочкарев-у3х
@ПавелБочкарев-у3х 11 ай бұрын
Через chocolatey
@harutavetisyan5683
@harutavetisyan5683 Жыл бұрын
Все таки не понятно. Почему yield session а не return. Тогда finally сработает сразу что ли?
@luchanos
@luchanos Жыл бұрын
Нет, чтобы часть кода запустилась до, а часть после yield. Советую почитать как работают генераторы
@Anshegar
@Anshegar 8 ай бұрын
Чувак нельзя так переделывать код "за кадром". Огромное спасибо за такой гайд,н о всетаки за кадром такие адовые куски работы оставлять нестоит.
@luchanos
@luchanos 8 ай бұрын
хэш коммита для этого специально пишу и ссылку на репку оставляю, чтобы можно было дифф посмотреть, изивини за неудобства, я пока готовил ролики, там за кадром могло происходить что-то что я мог потерять и поэтому стал крепить хэши спасибо за добрые слова и поддержку!
@saidserbiev4628
@saidserbiev4628 Жыл бұрын
Я изучаю Пайтон на степике, прошел типы данных, циклы, функции, щас множества изучаю , но все это затянулось, а изучать ещё много.Дайте совет пожалуйста.Нужно ли изучать дополнительно для бэкенда более сложные темы , что бы быстрее пройти обучение?или все таки поэтапно лучше ?
@vk2591
@vk2591 Жыл бұрын
нужно.
@David-yj5kv
@David-yj5kv Жыл бұрын
фастапи вряд ли стоит. Как успехи?
@saidserbiev4628
@saidserbiev4628 Жыл бұрын
@@David-yj5kv забросил из за работы и ряда других причин
@ruslankrabov6283
@ruslankrabov6283 Жыл бұрын
слабенько.@@saidserbiev4628
@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, с внедрением миграций алембика в тестах вроде разобрался.
@TheVenom20003
@TheVenom20003 Жыл бұрын
А как тут комментарии 5 дней назад вышли , если видео вчерашнее ?
@luchanos
@luchanos Жыл бұрын
это комментарии от подписчиков-спонсоров с бусти уровня Code Reviewer и выше - для них вся отложка открыта. И те, кто покупает отложенный контент разовыми микродонатами)
@fannigurt
@fannigurt Жыл бұрын
старая алхимия 🧑‍💻, DAL это про архитектуру это типо слой, DAO это про имплементацию, поэтому UserDAO
@luchanos
@luchanos Жыл бұрын
Спасибо! Учту
@antonzuzlov2046
@antonzuzlov2046 Жыл бұрын
Привет, думаю что можно для тестов запатчить так чтобы применились миграции проекта, думал код глянуть и мб мр какой кинуть, но не нашел.... думаю много кому был бы интересен код проекта
@luchanos
@luchanos Жыл бұрын
Спасибо! Думал что добавил. А теперь и правда добавил в описание) Ссылка на проект - github.com/luchanos/luchanos_oxford_university
@gvadellupa9335
@gvadellupa9335 Жыл бұрын
Кажется, логичнее models и migrations перенести в db
@arka4443
@arka4443 Жыл бұрын
А это урок прям для совсем нешарящих людей? Тут дело в архитектуре, dependency injection никакого ты не показал по сути, но если это прям для новичков, то Сойдет
Что-что Мурсдей говорит? 💭 #симбочка #симба #мурсдей
00:19
REAL or FAKE? #beatbox #tiktok
01:03
BeatboxJCOP
Рет қаралды 18 МЛН
FastAPI - простым языком. Зачем учить FastAPI?
12:18
Артём Шумейко
Рет қаралды 15 М.
LLM + RAG: ингредиенты приготовления умного ИИ-ассистента
31:48
Клуб разработчиков СПб
Рет қаралды 810
Что такое REST на самом деле?
11:32
Merion Academy
Рет қаралды 94 М.
FastAPI ТОП Библиотек и Расширений [2024]
12:21
Артём Шумейко
Рет қаралды 22 М.
Docker за 20 минут
21:42
suchkov tech
Рет қаралды 88 М.
ASYNCIO НА ПРАКТИЧЕСКОМ ПРИМЕРЕ
22:44
luchanos
Рет қаралды 28 М.