Création d’une application Django avec déploiement sur Google Cloud Platform :

ÉTAPE 3 : Base de données PostgreSQL

Nous traitons dans ce tutoriel de la mise en production d’une base de données sur GCP et son utilisation en phase de développement et/ou production.
Les principales étapes sont :

Ce tutoriel nécessite les prérequis suivants :

Création de la base de données sur GCP

Manuellement dans la console de GCP, allez dans SQL, puis cliquez sur CREER UNE INSTANCE et choisissez PostgreSQL (Pour ce tutriel, les paramètres utilisés pour la configuration de la base de données sont les paramètres minimums) :

ID de l'instance :
  pgsql-instance
  
  Mot de passe (compte 'postgres') :
  mot_de_passe_principal
  
  Edition Cloud SQL Enterprise / Bac à sable
  Région : europe-west1 (Belgique)
  Coeur dédié : 1
  Stockage : HDD 10Go

Puis cliquez sur Créer une instance

Aller dans le menu Bases de donnéesBases de données puis cliquer sur CREER UNE BASE DE DONNEES :

Nom de la base de données :
  ma_base_de_donnees

Aller dans le menu Utilisateur et cliquez sur AJOUTER UN COMPTE UTILISATEUR:

Nom d'Utilisateur :
  mon_nom_utilisateur
  Mot de passe :
  mon_de_passe_utiliateur

Cliquez sur AJOUTER.

Configuration dans notre projet Django

La base de donnée est configurée sur GCP. Ajoutons maintenant les informations de connection au fichier settings.py dans notre projet localement :

DATABASES = {
      'default': {
          'ENGINE': 'django.db.backends.postgresql',
          'HOST': '127.0.0.1',
          'NAME': 'ma_base_de_donnees',
          'USER': 'mon_nom_utilisateur',
          'PASSWORD': 'mon_de_passe_utiliateur',
          'PORT': '5432',
      }
  }

Installation du proxy pour se connecter à la base de données

Téléchargez le proxy d'authentification Cloud SQL pour se connecter à la base de données depuis notre poste en local :

curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.8.2/cloud-sql-proxy.linux.amd64
  

Rendez le proxy d'authentification Cloud SQL exécutable :

chmod +x cloud-sql-proxy

Pour exécuter le proxy :

./cloud-sql-proxy deploy-project-django:europe-west1:pgsql-instance
  

Utilisation de la base de données dans le projet Django

Il faut savoir que Django utilise des modèles orientés objets pour l’utilisation des bases de données. Il est possible d’utiliser des requêtes SQL classiques mais l’utilisation de “Models” permet une plus grande facilité de lecture et une sécurité accrue.

On ajoute le modèle pour la base de données dans le fichier models.py:

# models.py
  
  from django.db import models
  
  class MyTable(models.Model):
      firstname = models.CharField(max_length=10)
      lasttname = models.CharField(max_length=10)
      age = models.IntField()
  
      def __str__(self):
          return f"{self.firstname} {self.lastname} is {self.age} years old."

Puis les deux vues dans le fichier views.py qui devient :

from django.shortcuts import render
  from django.http import HttpResponse
  from .models import HistoricalQuote
  
  def hello_world(request):
      return HttpResponse("Hello, World!")
  
  
  def add_person(request):
      # Ajouter une nouvelle citation à la base de données
      person = MyTable(firstname='Manu', lastname='Mancuso' age='40')
      person.save()
      return HttpResponse("Personne ajoutée avec succès !")
  
  def view_persons(request):
      # Récupérer toutes les citations de la base de données
      persons = MyTable.objects.all()
  
      # Afficher les citations dans la réponse
      output = ', '.join([str(person) for person in persons])
      return HttpResponse(f"Liste des personnes : {output}")
  

Et les deux urls dans le fichier urls.py qui devient :

from django.urls import path
  from .views import hello_world, add_person, view_persons
  
  urlpatterns = [
      path('hello/', hello_world, name='hello_world'),
      path('add_person/', add_person, name='add_person'),
      path('view_persons/', view_persons, name='view_persons'),
  ]
  

On peut maintenant effectuer les migrations de la base de données à travers le proxy en utilisant les deux commandes suivantes dans le terminal :

python manage.py makemigrations
  python manage.py migrate

On remodifie le fichier settings.py pour la base de données avant le déploiement :

# Database
  # Si l'application est exécutée localement (utilisation du proxy) : DEVELOPPEMENT
  if DEBUG :
      DATABASES = {
              'default': {
                  'ENGINE': 'django.db.backends.postgresql',
                  'HOST': '127.0.0.1',
                  'NAME': 'ma_base_de_donnees',
                  'USER': 'mon_nom_utilisateur',
                  'PASSWORD': 'mon_de_passe_utiliateur',
                  'PORT': '5432',
              }
          }
  # Si l'application est exécutée sur GCP :  PRODUCTION
  else:
      DATABASES = {
              'default': {
                  'ENGINE': 'django.db.backends.postgresql',
                  'HOST': '/cloudsql/deploy-project-django:europe-west1:pgsql-instance',
                  'NAME': 'ma_base_de_donnees',
                  'USER': 'mon_nom_utilisateur',
                  'PASSWORD': 'mon_de_passe_utiliateur',
                  'PORT': '5432',
              }
          }

Uilisation en mode DÉVELOPPEMENT

Lorsqu’on est en phase de développement de notre projet Django, on peut utiliser la base de données distante à travers le proxy Cloud SQL comme on vient de voir avec son installation et configuration.

Dans le fichier settings.py la variable DEBUG doit être à True lorsqu’on est en déveleoppement.

Il faut aussi via le terminal se connecter au proxy avec la commande T./cloud-sql-proxy deploy-project-django:europe-west1:pgsql-instance

Uilisation en mode PRODUCTION

En production notre projet Django utilise la base de données directement sans l’utilisation du proxy.

Dans le fichier settings.py la variable DEBUG doit être à False .

Le déploiement est décrit à l’étape 2 “Docker et déploiement sur GCP”. Il faut simplement ajouter à la fin de la page de déploiement sur Cloud Run :

Description de l'image

Prochaine étape : Buckets (privé et publique) et leur utilisation