DEV Community

Cover image for How to build production-ready application with Django and PostgreSQL
Ousseynou Diop
Ousseynou Diop

Posted on • Edited on

How to build production-ready application with Django and PostgreSQL

Originally posted on my blog

Introduction

Build basic application everyone can do it but build real world production-ready application require lot of work.

In this guide i will show you how to build production-ready application with Django and Postgresql.

Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.

RDBMS is a database management system (DBMS) that is based on the relational model as introduced by E. F. Codd.

PostgreSQL is The World's Most Advanced Open Source Relational Database.

Prerequisites

I assume that you've some basic knowledge of Django and want to know how to make your application production-ready.

Installation

The first step in this guide is to install the pieces we need in order to use postgresql.

The following command will install all packages

sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib
Enter fullscreen mode Exit fullscreen mode

I will use pipenv for dependencies management.

This command will install pipenv on your system

pip install --user pipenv
Enter fullscreen mode Exit fullscreen mode

New Django project

Create a new folder and call it what you want

$ mkdir django_postgres
$ cd django_postgres
Enter fullscreen mode Exit fullscreen mode

Create a virtual environment with pipenv

$ pipenv shell
Enter fullscreen mode Exit fullscreen mode

Here is the output of the command

Creating a virtualenv for this project…
Using /usr/bin/python3 (3.7.5) to create virtualenv…
⠋Already using interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in /home/username/.local/share/virtualenvs/django_postgres-6CspIPh4/bin/python3
Also creating executable in /home/username/.local/share/virtualenvs/django_postgres-6CspIPh4/bin/python
Installing setuptools, pip, wheel...
done.

Virtualenv location: /home/username/.local/share/virtualenvs/django_postgres-6CspIPh4
Creating a Pipfile for this project…
Spawning environment shell (/usr/bin/zsh). Use 'exit' to leave.
Enter fullscreen mode Exit fullscreen mode

Install Django

$ pipenv install django
Enter fullscreen mode Exit fullscreen mode

The output of this command

Installing django…
Looking in indexes: https://pypi.python.org/simple
Collecting django
 Using cached Django-3.0.3-py3-none-any.whl (7.5 MB)
Collecting asgiref~=3.2
 Using cached asgiref-3.2.3-py2.py3-none-any.whl (18 kB)
Collecting sqlparse>=0.2.2
 Using cached sqlparse-0.3.0-py2.py3-none-any.whl (39 kB)
Collecting pytz
 Using cached pytz-2019.3-py2.py3-none-any.whl (509 kB)
Installing collected packages: asgiref, sqlparse, pytz, django
Successfully installed asgiref-3.2.3 django-3.0.3 pytz-2019.3 sqlparse-0.3.0

Adding django to Pipfile's [packages]…
Pipfile.lock not found, creating…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (7ff369)!
Installing dependencies from Pipfile.lock (7ff369)…
 🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 4/4 — 00:00:00
Enter fullscreen mode Exit fullscreen mode

Install postgresql driver

$ pipenv install psycopg2-binary
Enter fullscreen mode Exit fullscreen mode

The output

Installing psycopg2-binary…
Looking in indexes: https://pypi.python.org/simple
Collecting psycopg2-binary
 Using cached psycopg2_binary-2.8.4-cp37-cp37m-manylinux1_x86_64.whl (2.9 MB)
Installing collected packages: psycopg2-binary
Successfully installed psycopg2-binary-2.8.4

Adding psycopg2-binary to Pipfile's [packages]…
Pipfile.lock (7ff369) out of date, updating to (c90257)…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (c90257)!
Installing dependencies from Pipfile.lock (c90257)…
 🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 5/5 — 00:00:01
Enter fullscreen mode Exit fullscreen mode

Create a new Django project

The following command will create a new django project for us

$ django-admin startproject prodapplication
Enter fullscreen mode Exit fullscreen mode

Go to settings.py you will see a database configuration like this

# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases

DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.sqlite3',
       'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
   }
}
Enter fullscreen mode Exit fullscreen mode

SQlite is the default database for any Django project it help us to quickly prototyping a new idea.

Postgres Database & User Setup

Now logged into the postgresql shell

$ sudo -u postgres psql
Enter fullscreen mode Exit fullscreen mode

Create a database

CREATE DATABASE datbase_name;
Enter fullscreen mode Exit fullscreen mode

Create user

CREATE USER <username> WITH PASSWORD <password>;
Enter fullscreen mode Exit fullscreen mode

Set default encoding, transaction isolation scheme (Recommended from Django)

ALTER ROLE <username> SET client_encoding TO 'utf8';
ALTER ROLE <username> SET default_transaction_isolation TO 'read committed';
ALTER ROLE <username> SET timezone TO 'UTC';
Enter fullscreen mode Exit fullscreen mode

Give User access to database

GRANT ALL PRIVILEGES ON DATABASE <datbase_name> TO <username>;
Enter fullscreen mode Exit fullscreen mode

Quit out the shell

\q
Enter fullscreen mode Exit fullscreen mode

Manage dependencies

You can use Pipfile if you use pipenv or create a requirements.txt file and put your dependencies on it.

Ready to go

We've everything installed, now it’s time to do some production stuff.

Create a new file

I create a new file and called it local_settings.py, we will put all the production settings on this file.

Here is our folder structure

.
├── Pipfile
├── Pipfile.lock
└── prodapplication
   ├── manage.py
   └── prodapplication
       ├── asgi.py
       ├── __init__.py
       ├── local_settings.py
       ├── settings.py
       ├── urls.py
       └── wsgi.py
Enter fullscreen mode Exit fullscreen mode

Change Debug mode to False

DEBUG = False
Enter fullscreen mode Exit fullscreen mode

Change allowed host

ALLOWED_HOSTS = ['Your ip', 'www.domain.com', 'domain.com']
Enter fullscreen mode Exit fullscreen mode

Change The secret key

I use this tool to generate a Django secret key

SECRET_KEY = <your new secret key>
Enter fullscreen mode Exit fullscreen mode

Change the default database

DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.postgresql_psycopg2',
       'HOST': 'localhost',
       'NAME': '<database_name>',
       'USER': '<username>',
       'PASSWORD': '<password>',
       'PORT': '5432',
   }
}
Enter fullscreen mode Exit fullscreen mode

Configure your mail server

# Email config
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = '<your smtp server>'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'username'
EMAIL_HOST_PASSWORD = 'password'
EMAIL_USE_TLS = True
Enter fullscreen mode Exit fullscreen mode

Import the new configuration

Put the following code in your settings.py

try:
   from .local_settings import *
except ImportError:
   pass
Enter fullscreen mode Exit fullscreen mode

Test your new application

Run the following command

$ python manage.py migrate
$ python manage.py runserver
Enter fullscreen mode Exit fullscreen mode

Conclusion

Performance is very important if it come to the real word application and you must optimise your application and configure it in a way that perform well.
One of the key is to use a production-ready Database, like postgresql.

In this guide you've learned how to write a production Django application.

Thanks for reading.

Top comments (2)

Collapse
 
onlinejudge95 profile image
onlinejudge95

Not what I would call a production-ready setting. You are using psycopg2-binary in production, rather you should build psycopg2 from source and avoid using any binaries to go in production.

psycopg.org/docs/install.html#bina...

Collapse
 
xarala221 profile image
Ousseynou Diop

Thank you for your thought, this adds real value to the article.