Opinionated one-size-fits-most defaults for running Django to production (or any other deployed environment).
pip install django-production
DJANGO_SETTINGS_MODULE=yourproject.settings django-production-apply
When you install the package, it will install the following dependencies:
whitenoise
- for serving static filesdjango-environ
- for reading settings from environment variablesdjango-webserver[gunicorn]
- for running the webserver via manage.py
django-alive
- for a health check endpoint at /-/alive/
Running django-production-apply
will append the django-production
settings to your project's settings file and add the healthcheck endpoint to your project's urlpatterns
. You can see the settings that are added in settings.py.
You should add django-production
to your requirements to keep the necessary dependencies in place. Alternatively, once the patch is applied, you're free to move the dependencies into your own requirements file and remove django-production
altogether.
By default, static files are loaded from apps and the static
directory in your project. When building the project for deployment, you should run manage.py collectstatic --noinput
to collect static files into the static_collected
directory. In production, whitenoise
will serve the files in that directory. Be sure you use the {% static %}
template tag in your templates so you can take advantage of the Cache-Control
header that whitenoise
applies. You'll probably want to add static_collected
to your .gitignore
(or similar) file.
Start the webserver with python manage.py gunicorn
.
Set the WEB_CONCURRENCY
environment variable to the number of gunicorn workers you want to run. Start with 2x the number of CPU cores.
DJANGO_ENV
- set to production
to enable production settingsSECRET_KEY
- a secret key for your projectDJANGO_ENV=production
ALLOWED_HOSTS
- a comma-separated list of allowed hostsDEBUG
- defaults to False
you probably don't want to change thatDATABASE_URL
- a database URL (see https://django-environ.readthedocs.io/en/latest/types.html#environ-env-db-url)CACHE_URL
or REDIS_URL
- a cache URL (see https://django-environ.readthedocs.io/en/latest/types.html#environ-env-cache-url)SECURE_HSTS_INCLUDE_SUBDOMAINS
- set this to True
if your site doesn't have any subdomains that need to use HTTPUnder the hood, django-production
uses django-environ
's FileAwareEnv
class to read environment variables. This allows you to append _FILE
to any environment variable to load the value from a file. For example, DATABASE_URL_FILE=/var/run/secrets/DATABASE_URL
will load the database URL from that file.
You didn't ask any questions, but if you did, maybe it would be one of these:
Why did you write this?
Django takes an un-opinionated approach to how it should be deployed. This makes it harder for new users. Even experienced users probably copy this from project-to-project. This aims to make it easy to get a project ready to deploy. I also hope it will give us a chance to create some consensus around these settings as a community and maybe start folding some of this into Django itself.
Why are you writing to my settings file? You could just just do an import.
startproject
is already doing.I disagree with the settings/packages you're using.
Not a question, but ok. Feel free to submit an issue or pull request with your suggestion and reasoning. We appreciate the feedback and contributions. We may not accept changes that we don't feel fit the spirit of this project (remember, it's opinionated). If you're unsure, don't hesitate to ask.
To setup the project just install the dependencies with the tests dependencies included
$ pip install -e '.[test]'
if the command above doesn't work try this
$ pip install -e .[test]
$ pytest
django_production/__init__.py
CHANGELOG.md
git tag -s v0.9.9 -m v0.9.9
)git push && git push --tags
)flit publish