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

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

  • 22 апреля, 2021
  • читать 10 мин
Валерий Дузь
Валерий Дузь Senior Software Engineer в EPAM, Преподаватель Компьютерной школы 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