У меня есть определенные требования к Django-проектам, которые я создаю на своей работе, поэтому вот как я использую cookiecutter-django, чтобы помочь начать работу.
Что такое Cookiecutter Django?
Из документации: «Cookiecutter Django — это шаблон проекта для быстрого запуска готовых к производству Django-проектов».
Мои потребности
- SQLite для локальной разработки
- Docker для производства
- Heroku для предварительного просмотра сайтов
- Пользовательский облачный провайдер для статических файлов в продакшене
Установка
Установите cookiecutter
и запустите его в репозитории Cookiecutter Django.
pip install "cookiecutter>=1.7.0"
cookiecutter https://github.com/cookiecutter/cookiecutter-django
Добавьте свои имена, электронные адреса и т.д. Лично мне нравится использовать SendGrid для электронной почты из-за его отличного бесплатного уровня и простоты использования. Он также легко масштабируется до больших рабочих нагрузок для крупных клиентов. Whitenoise — это инструмент, который я люблю использовать для обслуживания статических файлов.
project_name [My Awesome Project]: Project Name
project_slug [project_name]:
description [Behold My Awesome Project!]:
author_name [Daniel Roy Greenfeld]: David Buckley
domain_name [example.com]: example.com
email [david-buckley@example.com]: dev@davidjaybuckley.com
version [0.1.0]:
Select open_source_license:
1 - MIT
2 - BSD
3 - GPLv3
4 - Apache Software License 2.0
5 - Not open source
Choose from 1, 2, 3, 4, 5 [1]: 5
timezone [UTC]:
windows [n]:
use_pycharm [n]:
use_docker [n]: y
Select postgresql_version:
1 - 14
2 - 13
3 - 12
4 - 11
5 - 10
Choose from 1, 2, 3, 4, 5 [1]: 1
Select cloud_provider:
1 - AWS
2 - GCP
3 - None
Choose from 1, 2, 3 [1]: 3
Select mail_service:
1 - Mailgun
2 - Amazon SES
3 - Mailjet
4 - Mandrill
5 - Postmark
6 - Sendgrid
7 - SendinBlue
8 - SparkPost
9 - Other SMTP
Choose from 1, 2, 3, 4, 5, 6, 7, 8, 9 [1]: 6
use_async [n]: y
use_drf [n]: y
Select frontend_pipeline:
1 - None
2 - Django Compressor
3 - Gulp
Choose from 1, 2, 3 [1]: 2
use_celery [n]:
use_mailhog [n]:
use_sentry [n]:
use_whitenoise [n]: y
use_heroku [n]: y
Select ci_tool:
1 - None
2 - Travis
3 - Gitlab
4 - Github
Choose from 1, 2, 3, 4 [1]:
keep_local_envs_in_vcs [y]: n
debug [n]: y
Настройка SQLite
Я не использую PostgreSQL в своей локальной среде, поэтому несколько вещей нужно изменить перед установкой требований.
В requirements/local.txt
удалите psycopg2
как зависимость (пакет PostgreSQL).
...
# psycopg2==2.9.3 # https://github.com/psycopg/psycopg2
...
Затем в config/settings/local.py
замените строку DATABASES = {"default": env.db("DATABASE_URL")}
на следующую.
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": ROOT_DIR / "db.sqlite3",
}
}
В этом же локальном файле настроек (поскольку в данный момент я не использую Docker в локальной среде) замените строку if env("USE_DOCKER") == "yes":
на:
if env("USE_DOCKER", default="no") == "yes":
Наконец, есть миграция, которая имеет некоторую логику, не работающую с базой данных SQLite, поэтому я добавил это. Файл, о котором идет речь, project_name/contrib/sites/migrations/0003_set_site_domain_and_name.py
.
def _update_or_create_site_with_sequence(site_model, connection, domain, name):
...
if (
created
and not "ENGINE" in settings.DATABASES["default"]
or settings.DATABASES["default"]["ENGINE"] != "django.db.backends.sqlite3"
):
# We provided the ID explicitly when creating the Site entry, therefore the DB
...
Сайт, который был создан в этой миграции, обычно является единственной записью сайта, которую я имею в локальной базе данных, поэтому эта миграция не влияет на то, что я делаю. При необходимости я могу обновить базу данных вручную с помощью SQL позже. Если у вас есть лучший способ сделать это, дайте мне знать в комментариях, но для меня это сработало.
Установка требований и перенос базы данных
Теперь мы готовы создать виртуальную среду, установить локальные требования и перенести базу данных.
python -m venv venv
source venv/bin/activate # venv/Scripts/activate for Windows
pip install -r requirements/local.txt
python manage.py migrate
Не забудьте добавить *.sqlite3
в файл .gitignore
(если его там еще нет, и вы готовы к локальной работе!