Как начать проект Python с Django в 2020 году

Я открываю терминал, создаю новый каталог в папке Projects. И что теперь?

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

Конечно, для этого можно использовать Cookiecutter. Мне он нравится, правда. Но если вы не знакомы с шаблоном, который используете, вы почувствуете, что теряете контроль... И если это произойдет в начале проекта, ничем хорошим это не закончится. Поэтому лучше понять основы того, что вы держите в руках.

В этой заметке я проведу вас только по самой базовой настройке проекта для Django, при этом все будет более или менее одинаково, если вы используете другой фреймворк или вообще не используете его. И я закончу процесс прямо перед написанием первой строки кода. Хотя я напишу еще одну статью о том, как настроить линтинг и тестирование, как я реализую чистую архитектуру в проекте Django, развертывание, CI/CD и так далее, если вы попросите об этом.

Версия Python

Мы в 2020 году, не так ли? Так что давайте использовать Python 3.8. Первая рекомендация: используйте pyenv. Это позволит иметь в системе любую версию Python, которая вам нужна, и переключаться на определенную версию в зависимости от сеанса оболочки или каталога, в котором вы находитесь. Очень удобно.

Установка установки проста. После установки pyenv вы можете установить нужную вам версию Python:

$ pyenv install 3.8.2

Тогда вы можете активировать эту версию в оболочке текущей сессии:

$ pyenv shell 3.8.2
$ python --version
Python 3.8.2

Прекрасно.

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

Выбор причудливого названия для вашего нового проекта будет самой трудной частью всего этого процесса. Чтобы вам было проще следовать этой статье, я собираюсь установить переменную окружения, поэтому задайте любое имя, которое вы хотите:

export PROJECT_NAME=the_project

Не очень креативно, я знаю.

Помните, мы активировали версию Python с помощью pyenv. Это означает, что мы находимся в новой виртуальной среде. Значит, мы можем устанавливать в ней что-то. Например, давайте установим Django:

$ pip install --user Django

Затем мы можем использовать django-admin для генерации базовой структуры проекта:

$ django-admin startproject $PROJECT_NAME

Следующая часть - это то, что мне нравится делать, но это не обычный способ структурирования проектов в Django, поэтому, возможно, вы захотите пропустить эту часть:

$ cd $PROJECT_NAME
$ mv $PROJECT_NAME/ config
$ find . -type f -name '*.py' -exec sed -i "s/$PROJECT_NAME/config/g" '{}' \;

Это переименование каталога, который django-admin создает внутри вашего проекта, с тем же именем, что и корневой каталог. Таким образом, мы поступаем следующим образом:

Image for post

Для этого:

Image for post

Конечно, дело не только в названии каталога, но и в том, что мы изменили ссылки в самом коде.

Опять же: это лишь косметическое изменение, которое идет вразрез со стандартным способом структурирования проекта Django. Вам не нужно так делать, но мне кажется, что это имеет смысл.

В любом случае, вы можете запустить сервер прямо сейчас, чтобы проверить, что все в порядке:

$ python manage.py runserver

Контроль версий

Это тривиально. Предположим, что вы все еще находитесь в корневом каталоге проекта:

$ git init

Следующий файл .gitignore также является базовым, но раньше я терял много времени на его написание вручную. Теперь нет:

$ curl https://raw.githubusercontent.com/github/gitignore/master/Python.gitignore --output .gitignore

Здесь будут рассмотрены все потребности проекта на Python.

В заключение:

$ git add .
$ git commit -m "Первая фиксация"

Python-окружение для проекта

Помните, мы установили версию Python для текущего сеанса оболочки, но было бы неплохо установить ее для проекта. Мы можем сделать это следующим образом:

$ pyenv local 3.8.2

Это создаст файл .python-version, который pyenv будет использовать для определения версии, которую нужно использовать при запуске python. Это полезно для вас, но и остальным членам команды не придется гадать, какую версию им нужно использовать.

$ git add .
$ git commit -m "Установить версию Python для проекта"

Красивое управление зависимостями и упаковками

Попрощайтесь со старым способом упаковки проекта Python с помощью setup.py и замораживания зависимостей в requirements.txt. И поздоровайтесь с Poetry. Этот инструмент поставляется со всем необходимым для работы с зависимостями, которые вам нужны.

Установите его для вашей системы, а затем запустите в корне вашего проекта:

$ poetry init -n

В результате будет создан файл pyproject.toml, который является новым стандартным способом настройки требований к сборке.

Например, давайте добавим единственную зависимость, которая у нас есть на данный момент:

$ poetry add Django

И готово! Это не только установит пакет, но и добавит его в конфигурационный файл вашего проекта. pip freeze больше нет. А если вам интересно, где poetry хранит виртуальное окружение для этого проекта, запустите poetry env info.

Сейчас, чтобы запустить ваш код, вам нужно сделать только:

$ poetry run python manage.py runserver

Не забудьте зафиксировать:

$ git add .
$ git commit -m "Добавить poetry"

Не связывайтесь с репо

Последним штрихом в этой настройке является добавление pre-commit. Это механизм для настройки списка проверок, которые будут выполняться каждый раз, когда вы делаете git commit.

$ poetry add -D pre-commit
$ poetry run pre-commit install

Проще простого. Первая команда добавит пакет pre-commit в разработку зависимостей (обратите внимание на параметр -D). Вторая команда установит хук в ваше локальное git-репо. Это нужно делать каждый раз, когда вы клонируете репо на новой машине, так что не забудьте добавить в README.

Сейчас вам нужно настроить его. Также очень просто:

$ poetry run pre-commit sample-config > .pre-commit-config.yaml

Это даст вам базовую конфигурацию. Но давайте добавим кое-что очень полезное:

cat >> .pre-commit-config.yaml << EOF
- repo: https://github.com/psf/black
rev: stable
hooks:
- id: black
language_version: python3.6
EOF

Black - это форматер кода, который должен быть обязательным для каждого проекта на Python. Существуют плагины для множества редакторов и IDE, поэтому вам стоит установить его, чтобы он переформатировал код каждый раз, когда вы сохраняете файл. Забудьте о размышлениях, нужно ли использовать одинарные или двойные кавычки, длину строк и так далее. Пишите Python-код настолько уродливо, насколько это возможно, и Black возьмет верх.

Давайте проверим это:

$ poetry run pre-commit run --all-files

Если возникла ошибка, это может означать, что черным пришлось форматировать некоторые файлы. Запустите снова и проверьте еще раз. Все должно закончиться чисто.

$ git add .
$ git commit -m "Добавить предварительную проверку"

Вот и все!

И мы закончили. Кажется, что нужно сделать много вещей, но все это можно поместить в Bash-файл, на выполнение которого уйдет всего несколько секунд:

# Версия Python
pyenv install 3.8.2
pyenv shell 3.8.2

# Создаем проект Django
export PROJECT_NAME=the_project

pip install --user Django
django-admin startproject $PROJECT_NAME

cd $PROJECT_NAME
mv $PROJECT_NAME/ config
find . -type f -name '*.py' -exec sed -i "s/$PROJECT_NAME/config/g" '{}' \;

# Контроль версий
git init
curl https://raw.githubusercontent.com/github/gitignore/master/Python.gitignore --output .gitignore
git add .
git commit -m "First commit"
 
# Среда Python для проекта
pyenv local 3.8.2
git add .
git commit -m "Установить версию Python для проекта"
 
# Красивое управление зависимостями и упаковкой
poetry init -n
poetry add Django
git add .
git commit -m "Добавить poetry"
 
# Не портить репозиторий
poetry add -D pre-commit
poetry run pre-commit install
poetry run pre-commit sample-config > .pre-commit-config.yaml
cat >> .pre-commit-config.yaml << EOF
- repo: https://github.com/psf/black
  rev: stable
  hooks:
    - id: black
      language_version: python3.6
EOF 

poetry run pre-commit run --all-files
# Не удалось?
poetry run pre-commit run --all-files
# Хорошо!
 
git add .
git commit -m "Добавить предварительную коммисию с Black"

Вы можете посмотреть окончательный проект в GitHub.

Завершение

Здесь есть много интересного:

  • Добавить линтер, проверку типов, тестирование,...
  • Установить скелет чистой архитектуры для Django.
  • CI для запуска тестов и публикации артефактов (на PyPI, например), развертывание,...
  • Генерирование документации.

https://medium.com/@cristobalcl/how-to-start-a-python-project-with-django-in-2020-803122721b23

Вернуться на верх