This guide describe how to deploy Django application on Heroku, gracefully! Yes, you heard it right. Heroku was mostly build with Ruby in mind but now it supports Python applications too. There are some points which are not mentioned in other blogs and Heroku official docs. I will try to describe all the process in detail here, so that you have a good experience deploying you apps. Lets get started!
Creating the Project
Creating your project is the most important step in this series. Create your application with default Django settings. These are the few configuration that you will have to do. You can create a Django project using following command:
django-admin startproject myproject
This tutorial talks about configuring Django apps created through above method!
If you are creating a new application I highly recommend using Heroku Django template. You can start your project as:
django-admin startproject --template=https://github.com/heroku/heroku-django-template/archive/master.zip --name=Procfile myproject
Note: If you created application using this template you can skip the configuration step.
Creating Virtual Environment
There are lot of packages in your default python path. You may want to create a fresh and sandboxed environment for this application. This avoids your global changes from affecting this application. Install virtualenv
with:
pip install virtualenv
You can create the virtual environment with following commands:
# creates virtualenv with name myenv, feel free to change it
virtualenv myenv
# activate the environment
source myenv/bin/activate
Installing Dependencies
These are few dependencies which are required to successfully deploy your application. Make sure you install them all.
pip install django
pip install gunicorn
pip install dj-database-url
pip install whitenoise
pip install psycopg2
You can get error while installing psycopg2. I found solution to that on stackoverflow:
sudo apt-get install libpq-dev python-dev
Try again installing psycopg2
!
You also want to install Heroku Toolbelt and git for your platform. This helps us easily manage our application remotely.
Try following commands on console to make sure you installed them properly:
heroku --help
git --help
If these commands return with some options, you have successfully installed them.
Did You Know? Heroku uses git to create local repository
Creating requirements.txt
There is no way for Heroku to know your application dependencies. So we need a requirements.txt
file in our root at the same level as manage.py
file.
We can generate the file with following command:
pip freeze > requirements.txt
Note: Make sure you create the file parallel to manage.py file.
Creating Procfile
Create a file called as Procfile
at same level as your manage.py
file. Put the following line into it:
web: gunicorn myproject.wsgi
Note: Procfile starts with a capital
P
Note: Make sure to change myproject.wsgi to yourprojectname.wsgi
This file is used by Heroku to determine what kind of service will be running on the server. It says that “We want a web server gunicorn with the project mentioned”
Creating runtime.txt
Herkou uses Python2
as default. If you are like me and want to use Python3
instead. You can create a file runtime.txt
in your project root at the same level as manage.py
You can find out your python version by firing:
python -V
then put the line in your runtime.txt
file as:
python-3.5.1
Configuring to Deploy
Now you are all set to Configure your Django app for Herkou. There are two files that you need to edit.
Modify settings.py
Open settings.py
file, it can be found under your myproject/myproject/setting.py
. There is only one settings.py
file in your project. Edit it and the following lines following:
# add this import at top
import dj_database_url
# scroll down to find entries related to DATABASE, below that put following lines
db_from_env = dj_database_url.config(conn_max_age=500)
DATABASES['default'].update(db_from_env)
# scroll down to find entries realted to STATIC, add these lines there
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'staticfiles')
STATIC_URL = '/static/'
# Extra places for collectstatic to find static files.
STATICFILES_DIRS = (
os.path.join(PROJECT_ROOT, 'static'),
)
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
# make sure to remove duplicates line if they exist
Modify wsgi.py
Find wsgi.py
file parallel to settings.py
file. Edit it and add following lines:
# Add these imports at top
from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise
application = get_wsgi_application()
application = DjangoWhiteNoise(application)
Create .gitignore
Create a git ignore file to avoid adding of unwanted files to our repository. Create a file called .gitignore
on your project root. Add following lines to it.
# name of your environment
venv
# do not allow python cache file
*.pyc
Alternatively you can delete the virtual environment venv
you created!
Deploy on Heroku
Now you are done with configuring Django application. We are now going to host our application to Heroku. We will use the herkou toolbelt and git we installed previously.
Go to heroku and sign up for an account. Do not forget to verify the email address. Fire in following commands while inside your project root.
heroku login
# Enter your login id and password you used to create the account
# Set up git flow
git init
git add .
# may have to provide email and name
git config user.email "email@domain.com"
git config user.name "yourname"
git commit -m 'Initial commit'
heroku create
# Creates a new application for this project
git push heroku master
# creates a local repository heroku and starts to host it on heroku
# if above step throws an error you may have to disable static collection and push again using above command
heroku config:set DISABLE_COLLECTSTATIC=1
heroku open
# opens you app on browser
heroku logs
# use this to see how your app is working in case you find some error
Conclusion
I have tried to give all the steps I took to deploy apps to heroku. If you find this article usefull share it with your friends. Feel free to comment about any improvement you would like to see.
We Learn, We Grow..