Данная статья подойдет начинающим разработчикам, которые имеют опыт разработки, но все еще не до конца понимают, что должно входить в проект.
Мы не будем разбирать, что такое 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