Skip to content

temirlan100/recipe-app-api

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

26 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Recipe app API

Привет!

В данном курсе вы научитесь работать с Django и его экосистемой. Курс лучше читать по коммитам, ниже увидите список коммитов от первого до завершающего, к каждому коммиту в данном readme будет описание того что происходит. Для комфорта советую работать на ОС Linux и в среде разработки PyCharm CE.

P.S. если что не ясно пишите мне в телегу @temirlan100, но сперва ГУГЛИТЕ! =)

Как полностью поймете все коммиты, сделаете ДЗ:

  • Дополните новые API (сперва тесты, затем функционал)
  • Прикрутите front к проекту на выбор (Vue, React, Angular)

Этот курс прокачает скиллы:

  • Django
  • Django Rest Framework
  • Travis CI
  • TDD
  • Docker
  • PostgreSQL

Commit #1

Создайте открытый репозиторий в github с названием recipe-app-api. При создании репозитория github предложит добавить файлы readme, .gitignore, license, стоит обратить внимание на .gitignore выберите язык Python и многие вещи с вашей локальной репы не будут лететь в github и это генерится автоматом. Если вы работаете через PyCharm стоит так же добавить .idea в .gitignore

Инициализация репозитория Click!

Commit #2

В этом коммите не нужно все копировать к себе, достаточно Dockerfile docker-compose.yml requirements.txt остальные файлы можно создать внутри контейнера так как это самые стартовые файлы Django и далее эти файлы появятся у вас в среде разработки.

Прежде чем делать посмотрите внимательно на Dockerfile и что именно он содержит. Давайте сперва попробуем собрать наш контейнер с помощью команды docker build ., если все прошло успешно то в конце будет такой текст Successfully built container_id, если возникла ошибка внимательно посмотрите на каком шаге, возможно в контейнере нет папки app или файла requirements.txt .

Теперь давайте попробуем собрать контейнер через docker-compose.yml файл с помощью команды docker-compose build если все прошло успешно то в конце будет такой текст

Successfully built container_id

Successfully tagged recipe-app-api:latest

Стоп в docker-compose.yml есть команда sh -c "python manage.py runserver 0.0.0.0:8000" которая запускает приложение Django, а саму штангу мы не инициализировали, а только поставили нужные зависимости. Давайте исправим! Наберите команду в терминале docker-compose run app sh -c "django-admin.py startproject app ." и если все прошло ок, тогда вы увидите файлы в папке app которая по умолчанию формирует Django.

Так же попробуйте открыть свое приложение через браузер по адресу http://localhost:8000, сперва набрав команду docker-compose up -d.

Стартуем штангу через докер Click!

Материал с пользой к коммиту:

Commit #3

Тут на самом деле целая пачка коммитов некоторые с ошибками xD, прошу вас так не делать! =).

Давайте попробуем прикоснуться к прекрасной штуке как CI, для этого сделайте авторизацию через ваш github аккаунт в https://travis-ci.com/, как все успешно выполните Travis-CI должен будет увидеть ваш репозиторий в github.

Прежде чем начинать стоит понять что такое CI и для чего нужен code linting in Python

Давайте попробуем запустить наш Pipeline с помощью Travis-CI. Для этого нужно задать конфигурационный файл и правила для Flake8 в этом коммите. Это описание для Travis-CI что нужно делать, а именно стоит обратить внимание на эту команду docker-compose run app sh -c "python manage.py test && flake8", то есть начинается прогон тестов (которых у нас пока нет) и проверка стиля кода нашего приложения. При успешном сценарии на сайте https://travis-ci.com/ во вкладке build-history будет ваша первая успешная сборка. После каждого вашего push в github, Travis-CI будет сам запускать билд.

Имеет смысл сделать маленькие оптимизации тут и здесь попробуйте разобрать для чего они нужны ; )

Материал с пользой к коммиту:

Commit #4

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

В данном коммите очень простые функции которые не относятся к проекту в целом, чтобы понять на кончиках пальца о чем речь. После того как напишите тесты и функции к ним попробуйте запустить команду docker-compose run app sh -c "python manage.py test && flake8" ваши 2 теста должны быть успешно пройдены и вывести такой текст Ran 2 tests in 0.69s.

Простые тесты Click!

Материал с пользой к коммиту:

Commit #5

Прежде чем приступить можно удалить файлы calc.py, tests.py.

Теперь будем кастомизировать Django user model. Давайте создадим приложение core с помощью Django для этого в терминал нужно ввести docker-compose run app sh -c "python manage.py startapp core" на уровне папки app и файла .flake8 у вас появится папка core. Стоит сразу удалить файлы tests.py так как не надо писать все тесты в одном файле не по Clean code это, в замен создайте py директорию (c init.py файлом) tests. Далее можно удалить view.py так как будет REST сервис. После всего нужно добавить core приложение в настройки Django в список INSTALLED_APPS.

В модели описываются поля, модель это представление таблицы в БД, а поля модели это колонки. После того как вы создали модель, необходимо добавить это в настройки Django AUTH_USER_MODEL = 'core.User', далее нужно сделать миграцию для этого введите следующую команду docker-compose run app sh -c "python manage.py makemigrations core" и у вас появится папка migrations c первым файлом миграции.

Далее можете списывать тест запускать как ранее, видеть как он падает и писать к нему функционал. В итоге у вас должно быть Ran 4 tests in 0.58s.

Customize django User Model Click!

Материал с пользой к коммиту:

Commit #6

Теперь давайте поработаем над функционалом в административной панели которая представляет штанга по умолчанию. Панель находится по адресу localhost:port/admin, но сейчас у вас будет ошибка, как ее исправить будет в следующих коммитах.

Помните мы про TDD подход. Давайте сделаем тесты для таких вещей как:

  • Просмотр списка пользователей
  • Просмотр конкретного пользователя
  • Доступность страницы редактирования пол-ля
  • Доступность страницы создания пол-ля

Подожди! Подумаете вы. Кого мы вообще будем смотреть?! Для этого есть метод setUp советую внимательно изучить его. И далее станет ясно как работают тесты test_user_listed, test_user_change_page.

Саму реализацию делаем через Django-admin, в основном тут только объявление полей все остальное есть из коробки, да штанга тут очень крута!

Funcs for users in Django-admin Click!

Материал с пользой к коммиту:

Commit #7

Все время мы работали с базой и по умолчанию штанга использует базу SQLite это не плохая файловая БД и обычно ее используют для production целей в мобильных клиентах, но для бэка мы возьмем базу PostgreSQL.

Теперь давайте добавим контейнер с БД в наш композ файл (ради всего не поднимайте production базу в контейнере делайте это на отдельной виртуальной машине или сервере!). Так же вы увидите в композ файле в db тэг environment так же не делайте так в production среде это чувствительные данные и их надо хранить в хранилище секретов.

Для того чтобы наше django-приложение работало с базой нужен драйвер для этого есть библиотека psycopg2. И не забудьте сделать настройки в DATABASES переменной.

Теперь сделаем промежуточную проверку. Для этого стяните данный коммит. Напишите команду docker-compose build чтобы убедится что все собирается без ошибок. Но если вы попробуете набрать docker-compose run app sh -c "python manage.py runserver 0.0.0.0:8000" у вас все сломается + ко всему билд в Travis-CI упадет, но на данном этапе так и должно быть! xD

А как тестить базу?! Для этого есть понятие как mocking. Так вот для мокания объектов внимательно посмотрите на файлы test_commands.py и wait_for_db. Чтобы у вас теперь все корректно запускалось, очистите контейнеры с помощью комманды docker-compose down -v. Далее попробуйте поднять приложение которое общается с базой через docker-compose up тут в логах вы увидите успешный запуск приложения и базы в двух разных контейнерах выйти из режима можно через ctrl+c. И после всего вы можете успешно прогнать тесты docker-compose run app sh -c "python manage.py test && flake8".

И теперь можно зайти в админку localhost:8000/admin, кстати чтобы не видеть логи в режиме онлайн можно запустить контейнеры в режиме демона docker-comnpose up -d, а сами логи контейнеров можно посмотреть так docker logs container_id -f --tail 50. Чтобы создать админа воспользуйтесь командой docker-compose run app sh -c "python manage.py createsuperuser" далее задаете почту и пароль, если после создания у вас не происходит вход в админку штанги то сделайте этот фикс.

App with DB Click!

Материал с пользой к коммиту:

Commit #8

Сделаем модуль по управлению пользователями. Сперва необходимо создать приложение docker-compose run --rm app sh -c "python manage.py startapp user". Из модуля можно удалить migrations , admin, test, создать python директорию tests(папка с init файлом внутри). Теперь добавим наш модуль в настройки INSTALLED_APPS. В настройки еще нужно добавить два приложения это rest_framework для простого создания ENDPOINT по REST к приложению и rest_framework.authtoken для работы с ключами чтобы наши ENDPOINT были доступны тому кому нужно. Необходимый коммит .

А теперь сделаем тест для создания пользователя, давайте сделаем разбивку нужно сделать тесты на создания, проверка что существует и длинна пароля должна быть не менее 5 символов. Если вы запустите тесты docker-compose run --rm app sh -c "python manage.py test && flake8" тогда тесты не пройдут, так как функционала еще нет. Коммит на тесты и коммит на покрытие тестов.

Напишем тесты и функционал для работы с токенами. Мы сделаем успешный тест где токен выдается и несколько не успешных сценариев вот коммит.

Сделайте проверку через браузер, перейдите по ссылке http://localhost:8000/api/user/create/ и создайте пользователя, затем перейдите api/user/token/ зайдите под пользователеи и получите в ответ сгенерированный ключ-токен.

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

Проверка браузера, перейдя по ссылке api/user/me/, НО только после того как получили токен и вставьте его через расширение в хроме, Authorization: Token your_token_here и вы получите данные по авторизованному пользователю. Там же доступны методы PUT и PATCH.

Материал с пользой к коммиту:

Commit #9

Нужно сделать тэги, чтобы потом было удобно сортировать, фильтровать данные по приложению, для этого предлагаю вынести в отдельное django приложение docker-compose run --rm app sh -c "python manage.py startapp recipe" и можно удалить оттуда models, admin, migrations,tests также изменить и добавить приложение в настройки INSTALLED_APPS, коммит для проверки.

Необходимо по FK связать таблицу тэгов с пользователями, для этого создается модель и не забываем про миграции при каждой новой модели docker-compose run --rm app sh -c "python manage.py makemigrations".

Разделим данные API на public & private, приватные апи доступны тем кто авторизован, иначе 401. Для авторизованных пользователей можно протестировать доступные теги для пользователя и лимиты по выдаче на будущей странице.

Tags API and tests Click!

Материал с пользой к коммиту:

Commit #10

Запилим ингредиенты(кулинарные =)) в нашем приложении! После создания модели, сделайте миграцию, чтобы в БД была нужная табличка.

Ingredients Click!

Commit #11

Какое же приложение с рецептами без самих рецептов! Настало время их написать. Понятное дело что нужно добавить модель для рецептов и конечно же сделать миграцию docker-compose run --rm app sh -c "python manage.py makemigrations core".

Recipe Click!

Материал с пользой к коммиту:

Commit #12

Сейчас вы сможете увидеть как заливаются различные файлы. Но сперва необходимо сделать настройки для работы с файлами. Внимательно просмотрите данный коммит, в нем содержатся нужные параметры, после изменений сделайте build образа через docker-compose build и для уверенности еще раз прогоните тесты docker-compose run --rm app sh -c "python manage.py test && flake8". В модель рецептов добавилось новое поле для картинки, перед тестами нужно сделать миграции docker-compose run --rm app sh -c "python manage.py makemigrations core".

Upload file Click!

Материал с пользой к коммиту:

Commit #13

И завершающий этап, это возможность фильтрации наших сущностей.

Filters Click!

Заключение

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

  • REST API;
  • Конфигурация проекта с помощью Docker;
  • Конфигурация Travis-CI;
  • Создания API(endpoints);
  • Загрузка картинок;
  • И конечно же Unit тесты;

Если Вам интересно двигаться дальше и понять как это приложение катить в AWS!, тогда советую вам этот курс! =))

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published