Как начать проект 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
создает внутри вашего проекта, с тем же именем, что и корневой каталог. Таким образом, мы поступаем следующим образом:
Для этого:
Конечно, дело не только в названии каталога, но и в том, что мы изменили ссылки в самом коде.
Опять же: это лишь косметическое изменение, которое идет вразрез со стандартным способом структурирования проекта 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 Djangogit 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
Вернуться на верх