Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 

README.md

Домашнее задание "Асинхронная работа с сетью и БД"

Задача:

  • скопируйте папку homework_04 для этой домашки (Памятка: https://github.com/OtusTeam/BasePython/tree/homeworks-new)
  • используйте следующие пакеты:
    • aiohttp
    • SQLAlchemy>=1.4
  • доработайте модуль jsonplaceholder_requests:
    • установите значения в константы USERS_DATA_URL и POSTS_DATA_URL (ресурсы нужно взять отсюда https://jsonplaceholder.typicode.com/)
    • создайте асинхронные функции для выполнения запросов к данным ресурсам (используйте aiohttp)
      • рекомендуется добавить базовые функции для запросов, которые будут переиспользованы (например fetch_json)
  • доработайте модуль models:
    • создайте асинхронный алхимичный engine (при помощи create_async_engine)
    • добавьте declarative base
    • создайте объект Session на основе класса AsyncSession
    • добавьте модели User и Post, объявите поля:
      • для модели User обязательными являются name, username, email
      • для модели Post обязательными являются user_id, title, body
      • создайте связи relationship между моделями: User.posts и Post.user
  • доработайте модуль main:
    • доработайте функцию main, по вызову которой будет выполняться полный цикл программы (добавьте туда выполнение асинхронной функции async_main при помощи asyncio.run):
      • создание таблиц (инициализация)
      • загрузка пользователей и постов
        • загрузка пользователей и постов должна выполняться конкурентно (параллельно) при помощи asyncio.gather
        • функции должны создавать новые объекты (например списки со словарями) и возвращать их как результат. Например:
          users_data: List[dict]
          posts_data: List[dict]
          users_data, posts_data = await asyncio.gather(
              fetch_users_data(),
              fetch_posts_data(),
          )
        • полученные данные передавайте в следующие функции для создания записей в БД
          • Важно! Объекты нужно создавать пачками, а не по одному. То есть сначала добавляем в сессию всех юзеров, затем выполняем коммит. Также и с постами - создавайте алхимичные объекты, добавляйте в сессию, и только после этого выполняйте коммит.

            Связь поста с юзером выполняется через установку user_id, поэтому нет необходимости искать объект пользователя в БД перед созданием поста.

        • никогда не используйте глобальные объекты для передачи данных между функциями
        • никогда не мутируйте глобальные объекты внутри функций
      • добавление пользователей и постов в базу данных (используйте полученные из запроса данные, передайте их в функцию для добавления в БД)
      • закрытие соединения с БД
  • добавьте новые зависимости в файл requirements.txt
    • в корне проекта, а не в папке с домашкой - там они не будут обнаружены
    • лучше добавьте зависимости вручную, но можно командой pip freeze > requirements.txt, в таком случае обязательно проверьте, что туда попало, и удалите лишнее

Критерии оценки:

  • все запросы в сеть и БД выполняются асинхронно
  • скрипт стягивает данные с API и складывает в БД
  • объекты пользователей и постов добавляются в БД пачками, а не по одному
  • созданы связи между пользователем и постом
  • не происходит мутации глобальных объектов
  • автоматический тест test_homework_04 проходит