Note to self — before deploying a local Django app to Heroku I should do the following:
Install the wsgi HTTP server, gunicorn:
pip install gunicorn
Install package to help work with environment variables:
pip install python-dotenv
Install Python-PostgreSQL Database Adapter:
pip install psycopg2
Create requirements file:
pip freeze > requirements.txt
Configure settings.py to load environment variables and the database:
import dotenv import dj_database_url # this line is already in your settings.py BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # load environment variables from .env dotenv_file = os.path.join(BASE_DIR, ".env") if os.path.isfile(dotenv_file): dotenv.load_dotenv(dotenv_file) # load database from the DATABASE_URL environment variable DATABASES = {} DATABASES['default'] = dj_database_url.config(conn_max_age=600)
Also delete the default database config:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
Add a .env file to project base directory and add the database URL:
DATABASE_URL=sqlite:///db.sqlite3
Make sure .env is added to .gitignore so it doesn’t get pushed to repo. My last .gitignore looked like:
*.pyc *~ __pycache__ myvenv venv db.sqlite3 .DS_Store .env
Assuming there is already a heroku account run:
heroku login
locally to associate machine with heroku account.
On the heroku dashboard create a new app. Under the “Settings” tab and under “Buildpacks” add a new buildpack called “heroku/python”.
Under “Config Variables” add “DISABLE_COLLECTSTATIC” with a value of “1”.
To set-up the database go back to command line and enter:
heroku addons:create heroku-postgresql:hobby-dev -a YOUR_APP_NAME
This provisions a new postgres database and should add the url to the Config Variables. Run command:
heroku config -a YOUR_APP_NAME
DATABASE_URL should be added to Config Variables.
Now create a new file called Procfile in the base directory of project and add:
web: gunicorn YOURSITE.wsgi --log-level=info --log-file -
Where YOURSITE is specific to the project.
Add another file in base directory called runtime.txt and add the version of python you want to use:
python-3.5.2
To serve static assets I use the WhiteNoise project. To install:
pip install whitenoise ... pip freeze > requirements.txt
Add it to the app by changing wsgi.py to include:
from django.core.wsgi import get_wsgi_application from whitenoise.django import DjangoWhiteNoise application = get_wsgi_application() application = DjangoWhiteNoise(application)
Now that should be it! Commit the changes locally then run:
git push heroku master
It should display the progress of installation and eventually be up and running.
References
This was trying to put a bunch of stuff I read in the articles below into an order I’ve found works for me.
https://blog.heroku.com/in_deep_with_django_channels_the_future_of_real_time_apps_in_django