Поради по старту проекту на Django і Docker

Поради по старту проекту на Django і Docker

  • 22 квітня, 2021
  • читати 10 хв
Валерій Дузь
Валерій Дузь Senior Software Engineer у EPAM, Викладач Комп'ютерної школи Hillel.

Дана стаття стане в нагоді розробникам-початківцям, які мають досвід розробки, але все ще не до кінця розуміють, що повинно входити в проект.

Тут я зібрав невелику вичавку речей, які роблять на реальних проектах, таких як перевірка якості коду, запуск тестів, додавання пакетного менеджера і докера.

Крім того, стаття буде корисною й більш досвідченим фахівцям, які можуть не знати деякі особливості інструментів.

Створення проекту

Для початку створюємо папку, в якій розмістимо проектні файли.

mkdir django_example

Після цього встановлюємо Poetry для зберігання пакетів. Перевага Poetry над голим pip полягає в тому, що він створює два файли.

У першому зберігає тільки пакети, які розробник встановлює безпосередньо командою установки. У другому — зафіксовані версії і дочірні бібліотеки, на які не потрібно звертати увагу.

Рекомендуємо курс по темі

pip3 install Poetry
poetry init
poetry shell
poetry add Django

Далі створюємо проект через Джанго команду.

django-admin startproject django_example

Структура проекту

На даний момент структура буде виглядати наступним чином:

├── django_example
│   ├── django_example
│   │   ├── __init__.py
│   │   ├── asgi.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   └── manage.py
├── poetry.lock
└── pyproject.toml

2 directories, 8 files

Стандартна структура проекту мені не особливо подобається для подальшої розробки, тому я раджу її трохи змінити таким чином:

├── poetry.lock
├── pyproject.toml
└── src
    ├── manage.py
    ├── server
    │   ├── __init__.py
    │   ├── asgi.py
    │   ├── urls.py
    │   └── wsgi.py
    └── settings
        ├── base.py
        └── develop.py

3 directories, 9 files

Окрема папка під settings потрібна для того, щоб зберігати різні настройки для різного оточення (dev, stage, prod).

Також обов'язково треба додати .gitignore в корінь проекту. Готових файлів .gitignore в інтернеті повно, як приклад: https://github.com/github/gitignore/blob/master/Python.gitignore.
Але не забуваємо додати ігнор файлів вашої IDE.

Тести

Для запуску тестів можна використовувати стандартну команду Django в manage.py.

python manage.py test

Або, якщо хочеться, можна встановити додатково pytest, ця бібліотека, так само як і unittest, вміє запускати тести в стилі unittest, але для мене вона має трохи більший функціонал.

Перевірка коду

У кожному хорошому проекті використовують лінтери для перевірки якості коду, я раджу ставити базові:

  • isort
    • Перевірка порядку імпорту модулів

  • prospector
    • Перевірка коду на предмет синтаксичних і логічних помилок

І також хочу звернути вашу увагу на бібліотеку black https://github.com/psf/black.

Вона не перевіряє код, а форматує за регламентом pep8.

Docker

Далі для оптимізації розробки і постачання програмного коду на сервера використовуємо Docker.

Трохи нижче навів два приклади Dockerfile і docker-compose.yml. Немає сенсу перераховувати, що робить кожен рядок, скажу тільки одне — в ports краще завжди вказувати на вхід 127.0.0.1, щоб тільки з локального комп'ютера запити могли летіти в Docker.

Dockerfile

FROM python:3
ENV PYTHONUNBUFFERED 1


WORKDIR /code
COPY . .


RUN pip install -U pip && \
   pip install poetry && \
   poetry config virtualenvs.create false && \
   poetry install --no-dev

docker-compose.yml

version: “3”
services:
   db:
     image: postgres
     environment:
       - POSTGRES_DB=postgres
       - POSTGRES_USER=postgres
       - POSTGRES_PASSWORD=password
     ports:
       - "127.0.0.1:5432:5432"
   web:
     build: .
     entrypoint: ./entrypoint.sh
     volumes:
       - .:/code
     ports:
       - "127.0.0.1:8000:8000"
     env_file:
       - .env
     depends_on:
       - db

Makefile

І вишенькою на торті я завжди додаю в кожен проект Makefile: https://gist.github.com/valeriiduz/180d1e02af03f21fcd38281720c4543f.

Принадність його полягає в тому, що він дозволяє скоротити довгі команди Докера. При цьому встановлювати його не треба, оскільки він входить в поставку будь-лінукс системи.

Як приклад, щоб запустити Докер контейнери, потрібно прописати наступну команду:

docker-compose up -d

Можна записати цю команду в Makefile:

start: ## Start all or c=<name> containers in background
	docker-compose -f $(or $(DOCKER_COMPOSE_FILE), docker-compose.yml) up -d $(c)

І далі в консолі можна просто прописувати:

make start