Как создать проект Django из шаблона

Автор оригинала: Valentino Gagliardi
  • Перевод
И снова здравствуйте! Специально для студентов курса «Web-разработчик на Python» мы подготовили еще один интересный перевод.





Шаблон проекта на Django – это естественный способ решения проблем, которые возникают, когда формат Django-проекта по умолчанию уже не отвечает требованиям. Сегодня в этом руководстве вы узнаете, как создать свой собственный проект из шаблона.

Что такое шаблон проекта в Django?


Одной из малоизвестных особенностей Django является возможность создания проекта из шаблона, то есть пользовательской структуры каталога.

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

Шаблон проекта Django – это не более чем проект с заранее определенной кастомной структурой каталогов, который вы можете создать сами за считанные минуты.
Примером популярного шаблона Django является django-cookiecutter. Django-cookiecutter обладает широким спектром функций и конфигураций, которые уже готовы к самодостаточному развертыванию на продакшен, это именно тот путь, который можно использовать для создания практически любого нового проекта на Django.

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

В следующих разделах вы узнаете, как создать свой собственный шаблон.

Как создать свой собственный шаблон проекта на Django


Для начала создайте виртуальную среду Python в выбранной папке и установите Django (обратите внимание, что это четыре отдельные команды):

mkdir project-name && cd $_
python3 -m venv venv
source venv/bin/activate
pip install django

Затем создайте проект Django с помощью:

django-admin startproject project_name .

Обратите внимание на название, оно должно быть именно project_name. После этого откройте проект в редакторе.

(Обратите внимание, что в нашем примере я использовал project_name для папки и для названия проекта).

Теперь вам нужно просмотреть каждый файл в проекте и заменить все project_name на {{ project_name }} (однострочная команда sed вполне подойдет).

Файлы, которые вам нужно будет изменить:

  • manage.py
  • settings.py
  • wsgi.py
  • asgi.py

Как вы могли догадаться, переменная {{ project_name }} – это плейсхолдер. Например, в manage.py вам нужно будет заменить следующее:

# manage.py

def main():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project_name.settings')
    try:
# omit

На это:

# manage.py

def main():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', '{{ project_name }}.settings')
    try:
# omit

В wsgi.py вы поменяете это:

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project_name.settings')

На следующее:

os.environ.setdefault('DJANGO_SETTINGS_MODULE', '{{ project_name }}.settings')

И так далее.

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

Перед тем, как приступить к следующему шагу не забудьте удалить виртуальную среду из шаблона проекта.

Как создать проект Django из собственного шаблона


Теперь, когда у вас есть шаблон проекта, вы можете его использовать.

Для этого создайте новую виртуальную среду Python в другой папке и установите Django:

mkdir new-django-project && cd $_
python3 -m venv venv
source venv/bin/activate
pip install django

Теперь вместо того, чтобы просто выполнить django-admin startproject, мы передадим флаг --template для установки из нашего шаблона. Допустим, если вы создали шаблон в своем домашнем каталоге ~/project-name, вы выполните:

django-admin startproject --template ~/project-name new_django_project .

Эта команда создаст новый проект Django из шаблона.

(Обратите внимание, что в этом примере я использовал new-django-project в качестве внешней папки и new_django_project для имени проекта).

Теперь вы можете задаться вопросом, возможно ли использовать удаленный шаблон из репозитория на GitHub, например. Да, конечно!

Как создать проект Django из удаленного шаблона


Флаг --template для startproject может принимать URL в качестве удаленного источника. Значит, вы можете создать Django-проект из удаленного шаблона, например:

django-admin startproject --template https://github.com/username/repo/archive/master.zip new_django_project .

Бонус: шаблоны для всего


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

Представьте, что вам нужно развернуться на Heroku, где требуется Procfile. Чтобы передать Procfile через систему шаблонов таким образом, чтобы {{ project_name }} заменялось фактическим именем проекта, можно выполнить startproject с флагом --name.

django-admin startproject --template https://github.com/username/repo/archive/master.zip --name=Procfile new_django_project .

Убедитесь, что в Procfile есть плейсхолдер для project_name:

release: python manage.py migrate
web: gunicorn -w 3 {{ project_name }}.wsgi --log-file -

Источники


Для создания сложного шаблона Django обратите внимание на ponee, легковесный Django-шаблон, готовый для использования с Heroku.

Вот такой небольшой, но интересный материал. Ждем ваши комментарии и приглашаем на бесплатный вебинар, в рамках которого мы подробно изучим, как тестировать проекты на Flask, писать и запускать тесты для проектов на Flask, создавать тестовые данные с помощью Faker и Factory Boy.
OTUS. Онлайн-образование
Цифровые навыки от ведущих экспертов

Комментарии 8

    0

    Никогда не понимал этого. Структуру проекта Django можно менять как угодно на протяжении всей жизни. Если это старый развесистый проект, то сложнее, но тут есть почти 100% вероятность, что и с самого начала нужный шаблон не подобрать.


    Эти шаблоны лишь добавляют лишний бойлерплейт и сложности. К тому же, кто постоянно создаёт проекты? Я пишу почти исключительно на Django с самого его появления. За все это время приходилось создавать проекты не более 10 раз (реже, чем раз в год). Обычно за это время и Django и все вокруг настолько сильно меняется, что никакой шаблон уже не подойдёт без напильника. Но напильником я лучше буду стандартную рыбу пилить.

      0

      Ну проекты разные бывают, вы не создаёте, кто-то создаёт, я, например, как-то делал штук 5-7 сайтов делал на django-cms, по сайту в неделю. Кроме этого можно наделать шаблонов под облачные сервисы и выложить их в открытый доступ. Ещё например у вас в компании есть какой-то стандарт и микросервисная архитектура, можно опять же создать шаблон для этого.

        0

        Микросервисы на Django — это оксюморон. Во всех остальных случаях мне хватило бы команды cp.

          0
          Микросервисы на Django — это оксюморон.

          Микро — не значит для одной задачи. Так что не соглашусь. Микросервисом может быть большой и сложный сервис одного ещё более огромного проекта.


          А по теме: cp может нехватить, если имя пакета много где упоминается, а проект не состоит из одного .py. Так что если вам хватает, то это не обязательно правильно.

            0

            Может быть, конечно, что я слишком категоричен. Но все-таки, я пишу на Django еще с версии 0.9.6 (если не ошибаюсь, столько лет уже прошло). И он мне как-то зашел. Я сделал на нем много проектов: от крохотных (настолько крохотных, что они задеплоены на AWS Lambda) до огромных международных (в частности, сейчас работаю над таким).


            И ни разу не вызывало затруднений начать проект. Более того, мне кажется, что каждый раз допиливая стандартную структуру Django под себя, я получал бесценный опыт о том, как лучше структурировать проекты, и по каким граблям можно пройтись (чего был бы лишен, если бы кормился готовыми "шаблонами" с ложечки).

              0
              Но все-таки, я пишу на Django еще с версии 0.9.6...

              Круто, но к чему это?


              Я сделал на нем много проектов

              За все это время приходилось создавать проекты не более 10 раз

              Вы либо путаетесь в показаниях, либо 10 раз считаете "много".
              Новый проект это может быть один файл settings.py, а может быть пакет с заготовками, файлы tox.ini и заготовкой тестов, setup.py и setup.cfg (для тех кто хотел бы оформить это как пакет), Dockerfile+helmchart для тех, кто всё это хочет укомплектовать в Кубике (например, даже для AutoDevOps Gitlab) и ещё много чего.
              Опять же, если вы единственный разработчик проектов, то руками можно спокойно создавать, но лично мне будет спокойнее, если я дам задание подчинённому создать проект и он разложит всё так, что другие участники будут понимать что и где лежит. Короче говоря то же самое, что написал kalombo.

                0
                Круто, но к чему это?

                К тому, что при большом опыте ни разу не испытывал необходимости в шаблонах для создания проекта.


                Мое неприятие наверное исходит из того, что я вообще не люблю шаблоны. Никогда не любил языки и фреймворки, которые требуют создавать большое количество шаблонного кода (например, Java).


                На мой взгляд, надо стремиться к тому, чтобы язык/фреймворк был максимально выразительным, чтобы было легко выразить намерения без всяких шаблонов.

              0
              Вроде как лучшие практики говорят, что микросервис должен выполнять лишь одну функцию…

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое