Укр
Советы по старту проекта на Django и Docker

Советы по старту проекта на Django и Docker

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

Данная статья подойдет начинающим разработчикам, которые имеют опыт разработки, но все еще не до конца понимают, что должно входить в проект.

Мы не будем разбирать, что такое Django, как работает Docker или в целом что можно сделать на Django. Тут я собрал небольшую выжимку вещей, которые делают на реальных проектах, таких как проверка качества кода, запуск тестов, добавление пакетного менеджера и докера.

Кроме того, статья подойдет не только начинающим разработчикам, которые проходят изучение Python с нуля онлайн, но и более опытным специалистам, которые могут не знать некоторые особенности инструментов.

Создание проекта

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

mkdir django_example

После этого устанавливаем Poetry для хранения пакетов. Преимущество Poetry над голым pip состоит в том, что он создает два файла.

В первом Poetry хранит только пакеты, которые разработчик устанавливает непосредственно командой установки. Во втором — зафиксированные версии и дочерние библиотеки, на которые не нужно обращать внимание.

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

pip3 install Poetry
poetry init
poetry shell
poetry add Django

Далее создаем проект через 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