Привет!
В данном курсе вы научитесь работать с Django и его экосистемой. Курс лучше читать по коммитам, ниже увидите список
коммитов от первого до завершающего, к каждому коммиту в данном readme будет описание того что происходит. Для комфорта
советую работать на ОС Linux и в среде разработки PyCharm CE.
P.S. если что не ясно пишите мне в телегу @temirlan100, но сперва ГУГЛИТЕ! =)
Как полностью поймете все коммиты, сделаете ДЗ:
- Дополните новые API (сперва тесты, затем функционал)
- Прикрутите front к проекту на выбор (Vue, React, Angular)
Этот курс прокачает скиллы:
- Django
- Django Rest Framework
- Travis CI
- TDD
- Docker
- PostgreSQL
Создайте открытый репозиторий в github
с названием recipe-app-api. При создании репозитория github
предложит
добавить файлы
readme
, .gitignore
, license
, стоит обратить внимание на
.gitignore
выберите язык Python и многие вещи с вашей локальной репы не будут лететь в github
и это генерится
автоматом. Если вы работаете через PyCharm
стоит так же добавить .idea
в .gitignore
Инициализация репозитория Click!
В этом коммите не нужно все копировать к себе, достаточно
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!
Материал с пользой к коммиту:
Тут на самом деле целая пачка коммитов некоторые с ошибками 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
будет сам запускать билд.
Имеет смысл сделать маленькие оптимизации тут и здесь попробуйте разобрать для чего они нужны ; )
Материал с пользой к коммиту:
Перейдем же к TDD, если коротко то представьте что вы сперва пишите тест к функции которой еще нет и только потом саму функцию, но более подробно можно тут глянуть, но`` и TDD не панацея =) но мы изучаем ведь это интресно.
В данном коммите очень простые функции которые не относятся к проекту в целом, чтобы понять на кончиках пальца о чем
речь. После того как напишите тесты и функции к ним попробуйте запустить
команду docker-compose run app sh -c "python manage.py test && flake8"
ваши 2 теста должны быть успешно пройдены и вывести такой текст
Ran 2 tests in 0.69s.
Материал с пользой к коммиту:
Прежде чем приступить можно удалить файлы 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!
Материал с пользой к коммиту:
- django startapp
- apps
- User model
- get user model
- check password
- abstract base user
- Base user manager
- permission mixin
- super user
- custom user model
Теперь давайте поработаем над функционалом в административной панели которая представляет штанга по умолчанию. Панель находится по адресу localhost:port/admin, но сейчас у вас будет ошибка, как ее исправить будет в следующих коммитах.
Помните мы про TDD подход. Давайте сделаем тесты для таких вещей как:
- Просмотр списка пользователей
- Просмотр конкретного пользователя
- Доступность страницы редактирования пол-ля
- Доступность страницы создания пол-ля
Подожди! Подумаете вы. Кого мы вообще будем смотреть?! Для этого есть метод setUp
советую внимательно изучить его. И
далее станет ясно как работают тесты
test_user_listed
, test_user_change_page
.
Саму реализацию делаем через Django-admin, в основном тут только объявление полей все остальное есть из коробки, да штанга тут очень крута!
Funcs for users in Django-admin Click!
Материал с пользой к коммиту:
Все время мы работали с базой и по умолчанию штанга использует базу 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"
далее задаете почту и пароль, если после создания у вас не происходит вход в админку штанги то
сделайте этот фикс.
Материал с пользой к коммиту:
- envs
- image of postgre
- depends_on
- psycopg2
- settings DATABASE
- os environ
- django-admin commands
- call_command
- djamgo unit test wait for DB
Сделаем модуль по управлению пользователями. Сперва необходимо создать
приложение 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
.
Материал с пользой к коммиту:
Нужно сделать тэги, чтобы потом было удобно сортировать, фильтровать данные по приложению, для этого предлагаю вынести в
отдельное 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. Для авторизованных пользователей можно протестировать доступные теги для пользователя и лимиты по выдаче на будущей странице.
Материал с пользой к коммиту:
- model.str
- model admin
- foreign key
- FK delete
- HTTP codes
- Model serializer
- Model view set
- Custom view set
Запилим ингредиенты(кулинарные =)) в нашем приложении! После создания модели, сделайте миграцию, чтобы в БД была нужная табличка.
Какое же приложение с рецептами без самих рецептов! Настало время их написать. Понятное дело что нужно добавить модель
для рецептов и конечно же сделать миграцию docker-compose run --rm app sh -c "python manage.py makemigrations core"
.
Материал с пользой к коммиту:
Сейчас вы сможете увидеть как заливаются различные файлы. Но сперва необходимо сделать настройки для работы с файлами.
Внимательно
просмотрите данный коммит,
в нем содержатся нужные параметры, после изменений сделайте 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"
.
Материал с пользой к коммиту:
И завершающий этап, это возможность фильтрации наших сущностей.
Спасибо что, дошли до этого места! Вы почерпнули для себя много полезных и важных концепций которые можно применять у себя. В итоге вы лучше стали понимать:
- REST API;
- Конфигурация проекта с помощью Docker;
- Конфигурация Travis-CI;
- Создания API(endpoints);
- Загрузка картинок;
- И конечно же Unit тесты;
Если Вам интересно двигаться дальше и понять как это приложение катить в AWS!, тогда советую вам этот курс! =))