Comment utiliser Postgresql avec votre application Django sur Debian 8

introduction

Django est un framework flexible permettant de créer rapidement des applications Python. Par défaut, les applications Django sont configurées pour stocker des données dans un fichier de base de données SQLite léger. Bien que cela fonctionne bien sous certaines charges, un SGBD plus traditionnel peut améliorer les performances en production.

Dans ce guide, nous montrerons comment installer et configurer PostgreSQL pour l’utiliser avec vos applications Django. Nous allons installer le logiciel nécessaire, créer les informations d’identification de la base de données pour notre application, puis démarrer et configurer un nouveau projet Django pour utiliser ce moteur.

Conditions préalables

Pour commencer, vous aurez besoin d’une instance de serveur Debian 8 vierge avec un utilisateur non-root configuré. L’utilisateur non root doit être configuré avec les privilèges + sudo +. Apprenez à configurer ceci en suivant notre guide de configuration du serveur initial.

Lorsque vous êtes prêt à continuer, connectez-vous en tant qu’utilisateur + sudo + et poursuivez votre lecture.

Installer les composants à partir des référentiels Debian

Notre première étape consistera à installer toutes les pièces dont nous avons besoin des référentiels. Nous allons installer + pip +, le gestionnaire de paquets Python, afin d’installer et de gérer nos composants Python. Nous installerons également le logiciel de base de données et les bibliothèques associées nécessaires pour interagir avec eux.

Python 2 et Python 3 nécessitent des packages légèrement différents, choisissez donc les commandes ci-dessous qui correspondent à la version Python de votre projet.

Si vous utilisez * Python 2 *, tapez:

sudo apt-get update
sudo apt-get install python-pip python-dev libpq-dev postgresql postgresql-contrib

Si vous utilisez * Python 3 *, tapez:

sudo apt-get update
sudo apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib

Une fois l’installation terminée, nous pouvons passer à la création de notre base de données et de son utilisateur.

Créer une base de données et un utilisateur de base de données

Par défaut, Postgres utilise un schéma d’authentification appelé «authentification homologue» pour les connexions locales. En gros, cela signifie que si le nom d’utilisateur du système d’exploitation de l’utilisateur correspond à un nom d’utilisateur valide de Postgres, cet utilisateur peut se connecter sans autre authentification.

Lors de l’installation de Postgres, un utilisateur du système d’exploitation nommé + postgres + a été créé pour correspondre à l’utilisateur administratif + postgres + PostgreSQL. Nous devons utiliser cet utilisateur pour effectuer des tâches administratives. Nous pouvons utiliser + sudo + et transmettre le nom d’utilisateur avec l’option + -u +.

Connectez-vous à une session interactive Postgres en tapant:

sudo -u postgres psql

Tout d’abord, nous allons créer une base de données pour notre projet Django. Chaque projet doit avoir sa propre base de données isolée pour des raisons de sécurité. Nous appellerons notre base de données ++ dans ce guide, mais il est toujours préférable de sélectionner quelque chose de plus descriptif pour de vrais projets:

CREATE DATABASE ;
OutputCREAT DATABASE

Ensuite, nous allons créer un utilisateur de base de données que nous utiliserons pour se connecter et interagir avec la base de données. Définissez le mot de passe sur quelque chose de fort et sécurisé:

CREATE USER  WITH PASSWORD '';
OutputCREATE ROLE

Nous allons ensuite modifier quelques paramètres de connexion pour l’utilisateur que nous venons de créer. Cela accélérera les opérations sur la base de données car il ne sera pas nécessaire de rechercher les valeurs correctes et de les définir à chaque fois qu’une connexion est établie.

Nous définissons le codage par défaut sur UTF-8, qui correspond au format attendu par Django. Nous définissons également le schéma d’isolation de transaction par défaut sur «lecture validée», ce qui bloque les lectures des transactions non validées. Enfin, nous établissons le fuseau horaire. Par défaut, vos projets Django seront configurés pour utiliser + UTC. Toutes ces recommandations proviennent de du projet Django lui-même.

ALTER ROLE  SET client_encoding TO 'utf8';
ALTER ROLE  SET default_transaction_isolation TO 'read committed';
ALTER ROLE  SET timezone TO 'UTC';
OutputALTER ROLE
ALTER ROLE
ALTER ROLE

Il ne reste plus qu’à donner à notre base de données les droits d’accès à la base de données que nous avons créée:

GRANT ALL PRIVILEGES ON DATABASE  TO ;
OutputGRANT

Quittez l’invite SQL lorsque vous avez terminé.

\q

Vous devriez maintenant être ramené à votre session shell précédente.

Installer Django dans un environnement virtuel

Maintenant que notre base de données est configurée, nous pouvons installer Django. Pour plus de flexibilité, nous installerons Django et toutes ses dépendances dans un environnement virtuel Python. Le package + virtualenv + vous permet de créer facilement ces environnements.

Si vous utilisez * Python 2 *, vous pouvez installer le bon paquet en tapant:

sudo pip install virtualenv

Si vous utilisez * Python 3 *, vous pouvez installer le bon paquet en tapant:

sudo pip3 install virtualenv

Créez et déplacez-vous dans un répertoire pour contenir votre projet Django:

mkdir ~/
cd ~/

Nous pouvons créer un environnement virtuel pour stocker les exigences de votre projet Django en Python en tapant:

virtualenv

Cela installera une copie locale de Python et une commande locale + pip + dans un répertoire appelé ++ dans votre répertoire de projet.

Avant d’installer des applications dans l’environnement virtuel, nous devons l’activer. Vous pouvez le faire en tapant:

source /bin/activate

Votre invite changera pour indiquer que vous travaillez maintenant dans l’environnement virtuel. Cela ressemblera à quelque chose comme ceci + () @: ~ / $ +.

Une fois que votre environnement virtuel est actif, vous pouvez installer Django avec + pip +. Nous allons également installer le paquetage + psycopg2 + qui nous permettra d’utiliser la base de données que nous avons configurée:

Note

pip install django psycopg2

Nous pouvons maintenant démarrer un projet Django dans notre répertoire + myproject +. Cela créera un répertoire enfant du même nom qui contiendra le code lui-même et créera un script de gestion dans le répertoire actuel:

django-admin.py startproject  .

Votre structure de répertoire actuelle devrait ressembler à ceci:

.
└── ./myproject/
   ├── manage.py
   ├── myproject/
   │   ├── __init__.py
   │   ├── settings.py
   │   ├── urls.py
   │   └── wsgi.py
   └── venv/
       └── . . .

Comme vous pouvez le constater, nous avons un répertoire de projet parent contenant un script + manage.py, un répertoire de projet interne et le répertoire d’environnement virtuel` + venv` créé précédemment.

Configurer les paramètres de la base de données Django

Maintenant que nous avons un projet, nous devons le configurer pour utiliser la base de données que nous avons créée.

Ouvrez le fichier de paramètres du projet Django principal situé dans le répertoire du projet enfant:

nano ~///settings.py

Avant de configurer la base de données, vous devrez peut-être également ajuster la directive + ALLOWED_HOSTS +. Ceci définit une liste blanche d’adresses ou de noms de domaines pouvant être utilisés pour se connecter à l’instance de Django. Toute demande entrante avec un en-tête * Host * qui ne figure pas dans cette liste déclenchera une exception. Django exige que vous définissiez cela pour empêcher une certaine classe de vulnérabilité de sécurité.

Entre les crochets, répertoriez les adresses IP ou les noms de domaine associés à votre serveur Django. Chaque élément doit être répertorié * entre guillemets * avec des entrées * séparées par une virgule *. Si vous souhaitez répondre aux demandes d’un domaine et de tout sous-domaine, ajoutez une période au début de l’entrée. Dans l’extrait de code ci-dessous, quelques exemples commentés sont utilisés pour illustrer la manière correcte de formater les entrées:

~ / monprojet / monprojet / settings.py

. . .
# The simplest case: just add the domain name(s) and IP addresses of your Django server
# ALLOWED_HOSTS = [ 'example.com', '203.0.113.5']
# To respond to 'example.com' and any subdomains, start the domain with a dot
# ALLOWED_HOSTS = ['.example.com', '203.0.113.5']
ALLOWED_HOSTS = ['', '', ]

Ensuite, recherchez la section + DATABASES + qui ressemble à ceci:

~ / monprojet / monprojet / settings.py

. . .

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

. . .

Ceci est actuellement configuré pour utiliser SQLite en tant que base de données. Nous devons changer cela pour que notre base de données PostgreSQL soit utilisée à la place.

Commencez par modifier le moteur afin qu’il utilise l’adaptateur + postgresql_psycopg2 + au lieu de l’adaptateur + sqlite3 +. Pour le + NAME +, utilisez le nom de votre base de données (++ dans notre exemple). Nous devons également ajouter des identifiants de connexion. Nous avons besoin du nom d’utilisateur, du mot de passe et de l’hôte pour nous connecter. Nous allons ajouter et laisser en blanc l’option du port afin que la valeur par défaut soit sélectionnée:

~ / monprojet / monprojet / settings.py

. . .

DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.',
       'NAME': '',
       'USER': '',
       'PASSWORD': '',
       'HOST': 'localhost',
       'PORT': '',
   }
}

. . .

Lorsque vous avez terminé, enregistrez et fermez le fichier.

Migrer la base de données et tester votre projet

Maintenant que les paramètres Django sont configurés, nous pouvons migrer nos structures de données vers notre base de données et tester le serveur.

Nous pouvons commencer par créer et appliquer des migrations à notre base de données. Comme nous n’avons pas encore de données réelles, cela va simplement configurer la structure de base de données initiale:

cd ~/
./manage.py makemigrations
./manage.py migrate

Après avoir créé la structure de la base de données, nous pouvons créer un compte administratif en tapant:

./manage.py createsuperuser

Vous serez invité à sélectionner un nom d’utilisateur, à fournir une adresse électronique, à choisir et à confirmer un mot de passe pour le compte.

Ensuite, vous pouvez vérifier que votre base de données fonctionne correctement en lançant le serveur de développement Django:

./manage.py runserver 0.0.0.0:8000

Dans votre navigateur Web, visitez le nom de domaine ou l’adresse IP de votre serveur suivi de «+: 8000 +» pour atteindre la page racine par défaut de Django:

http://:8000

Vous devriez voir la page d’index par défaut:

image: https: //assets.digitalocean.com/articles/django_mysql_1404/django_index.png [index Django]

Ajoutez + / admin + à la fin de l’URL pour pouvoir accéder à l’écran de connexion à l’interface d’administration:

image: https: //assets.digitalocean.com/articles/django_mysql_1404/admin_login.png [Connexion à l’administrateur Django]

Entrez le nom d’utilisateur et le mot de passe que vous venez de créer à l’aide de la commande + createuperuser +. Vous serez ensuite amené à l’interface d’administration:

image: https: //assets.digitalocean.com/articles/django_mysql_1404/admin_interface.png [Interface d’administration Django]

Une fois l’enquête terminée, vous pouvez arrêter le serveur de développement en appuyant sur CTRL-C dans la fenêtre de votre terminal.

En accédant à l’interface d’administration, nous avons confirmé que notre base de données avait stocké les informations de notre compte utilisateur et que l’accès à celle-ci était approprié.

Nous pouvons valider cela davantage en interrogeant la base de données Postgres elle-même en utilisant le client + psql +. Par exemple, nous pouvons nous connecter à notre base de données de projets (+ myproject +) avec l’utilisateur de notre projet (+ myprojectuser +) et imprimer tous les tableaux disponibles en tapant:

psql -W   -h 127.0.0.1 -f <(echo '\dt')

L’indicateur + -W + permet à + ​​psql + de vous demander le mot de passe approprié. Nous devons explicitement utiliser l’indicateur + -h + pour nous connecter à l’hôte local sur le réseau pour indiquer que nous voulons utiliser l’authentification par mot de passe au lieu de l’authentification par les pairs. Nous utilisons l’indicateur + -f + pour transmettre la méta-commande + psql + que nous voulons exécuter, + \ dt +, qui répertorie toutes les tables de la base de données:

Output                      List of relations
Schema |            Name            | Type  |     Owner
--------+----------------------------+-------+---------------
public | auth_group                 | table | myprojectuser
public | auth_group_permissions     | table | myprojectuser
public | auth_permission            | table | myprojectuser
public | auth_user                  | table | myprojectuser
public | auth_user_groups           | table | myprojectuser
public | auth_user_user_permissions | table | myprojectuser
public | django_admin_log           | table | myprojectuser
public | django_content_type        | table | myprojectuser
public | django_migrations          | table | myprojectuser
public | django_session             | table | myprojectuser
(10 rows)

Comme vous pouvez le constater, Django a créé des tables dans notre base de données qui confirment la validité de nos paramètres.

Conclusion

Dans ce guide, nous avons montré comment installer et configurer PostgreSQL en tant que base de données principale pour un projet Django. Alors que SQLite peut facilement gérer la charge lors du développement et de la production légère, la plupart des projets bénéficient de la mise en œuvre d’un SGBD plus complet.