My Cookiecutter Django Setup

buckldav

David

Posted on July 27, 2022

My Cookiecutter Django Setup

I have some specific requirements for the Django projects I create at my job, so here's how I use cookiecutter-django to help get things going.

What is Cookiecutter Django?

From the docs: "Cookiecutter Django is a project template for jumpstarting production-ready Django projects."

My Needs

  • SQLite in local development
  • Docker for production
  • Heroku for site previews
  • Custom cloud provider for static files in production

Setup

Install cookiecutter and run it against the Cookiecutter Django repository.

pip install "cookiecutter>=1.7.0"
cookiecutter https://github.com/cookiecutter/cookiecutter-django
Enter fullscreen mode Exit fullscreen mode

Add your own names, emails, etc. Personally, I like using SendGrid for email because of its great free tier and ease of use. It's also easily scaled to larger workloads for larger client. Whitenoise is the tool I like using for static file serving.

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
Enter fullscreen mode Exit fullscreen mode

Setting Up SQLite

I don't use PostgreSQL in my local environment, so a few things need changed before installing the requirements.

In requirements/local.txt, remove psycopg2 as a dependency (the PostgreSQL package).

...
# psycopg2==2.9.3  # https://github.com/psycopg/psycopg2
...
Enter fullscreen mode Exit fullscreen mode

Then, in config/settings/local.py, replace the line DATABASES = {"default": env.db("DATABASE_URL")} with the following.

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": ROOT_DIR / "db.sqlite3",
    }
}
Enter fullscreen mode Exit fullscreen mode

While in this same local settings file (because I'm not using Docker in the local environment at the moment), replace the line if env("USE_DOCKER") == "yes": with:

if env("USE_DOCKER", default="no") == "yes":
Enter fullscreen mode Exit fullscreen mode

Finally, there is a migration that has some logic that doesn't work with a SQLite database, so I added this. The file in question is 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
        ...
Enter fullscreen mode Exit fullscreen mode

The site that was created in this migration is typically the only site record I have in local so this migration doesn't really affect what I'm doing anyway. I can update the database manually with SQL if needed later. If you have a better way to do this, let me know in the comments, but this worked for me.

Install Requirements and Migrate Database

Now we're ready to create a virtual environment, install local requirements, migrate the database.

python -m venv venv
source venv/bin/activate # venv/Scripts/activate for Windows
pip install -r requirements/local.txt
python manage.py migrate
Enter fullscreen mode Exit fullscreen mode

Be sure to add *.sqlite3 to your .gitignore file (if it's not already there and you're ready to go in local!

💖 💪 🙅 🚩
buckldav
David

Posted on July 27, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related