• 4 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 19/02/2020

Séparez les environnements

Vous avez pu le voir, les réglages en production sont différents des réglages en local. Et encore, nous n’avons pas parlé des serveurs de test !

Plus votre projet grossira, et plus les réglages s’affineront. Il est alors d’usage de séparer les fichiers de configuration en fonction de l’environnement. La manière la plus simple d'effectuer cela est de créer un module contenant un fichier par environnement.

Nous n'allons pas travailler directement sur le serveur mais en local. Pourquoi ? Car il est très dangereux de manipuler les fichiers de l'application en production. Si un utilisateur lance une requête, les résultats peuvent être assez étonnants.

Si ce n'est pas déjà fait, clonez en local le dépôt GitHub que vous avez forké précédemment.

Environnement local

Créez un nouveau module :

$ mkdir disquaire_project/settings
$ touch disquaire_project/settings/__init__.py

Par commodité, les réglages par défaut seront ceux de développement. Vous pourrez ensuite ajouter un fichier par environnement pour écraser les réglages par défaut.

Copiez l'intégralité de settings.py et collez-le dans __init__.py. Quand c'est fait, vous pouvez supprimer settings.py.

Puis parcourez le fichier __init__.py pour ne garder que les réglages spécifiques à votre environnement de développement local. Vous pouvez par conséquent supprimer les structures conditionnelles if os.environ.get('ENV') == 'PRODUCTION'

settings/__init__.py

"""
Django settings for disquaire_project project.

Generated by 'django-admin startproject' using Django 1.11.3.

For more information on this file, see
https://docs.djangoproject.com/en/1.11/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.11/ref/settings/
"""

import os


# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '4i&u(!%shd*0-3$ls)fohsjsd48t(gu%1-ch_wyzk7@#n3bd8e'
# '-~aO;| F;rE[??/w^zcumh(9'


# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True


ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
    'store.apps.StoreConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'debug_toolbar',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'debug_toolbar.middleware.DebugToolbarMiddleware',
]

ROOT_URLCONF = 'disquaire_project.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]


WSGI_APPLICATION = 'disquaire_project.wsgi.application'


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

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql', # on utilise l'adaptateur postgresql
        'NAME': 'disquaire', # le nom de notre base de données créée précédemment
        'USER': 'celinems', # attention : remplacez par votre nom d'utilisateur !!
        'PASSWORD': '',
        'HOST': '',
        'PORT': '5432',
    }
}



# Password validation
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/

LANGUAGE_CODE = 'fr'

TIME_ZONE = 'Europe/Paris'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/

STATIC_URL = '/static/'

# Django debug toolbar
INTERNAL_IPS = ['127.0.0.1']

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

Environnement de production

Le fichier concernant les réglages de production est particulier car il contient des informations sensibles : les identifiants de connexion à la base de données, la clé secrète... Vous ne voulez surtout pas qu'elles se retrouvent sur GitHub !

Donc voici ce que je vous propose : ce fichier de configuration ne doit exister que sur le serveur et nulle part ailleurs. Vous pouvez donc :

  • créer un fichier .gitignore pour indiquer à Git de ne pas tracker production.py ;

  • envoyer sur GitHub les modifications que vous venez juste d'apporter ;

  • puller sur le serveur ces mêmes modifications ;

  • créer un fichier production.py sur le serveur et y ajouter les informations.

C'est parti !

$ touch .gitignore

.gitignore

disquaire_project/settings/production.py
__pycache__
disquaire_project/staticfiles/
$ git add .gitignore disquaire_project/settings
$ git commit -m "new settings configuration"
$ git push origin master

Puis rendez-vous sur le serveur :

celinems@disquaire:~/disquaire$ git pull origin master

À présent, ajoutez-y un nouveau document qui regroupera les informations de production :

$ celinems@disquaire:~/disquaire$ touch disquaire_project/settings/production.py

settings/production.py

from . import *

SECRET_KEY = '-~aO;| F;rE[??/w^zcumh(9'
DEBUG = False
ALLOWED_HOSTS = ['178.62.117.192']

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql', # on utilise l'adaptateur postgresql
        'NAME': 'disquaire', # le nom de notre base de données créée précédemment
        'USER': 'celinems', # attention : remplacez par votre nom d'utilisateur !!
        'PASSWORD': '0+0=LaTeteàT0t0',
        'HOST': '',
        'PORT': '5432',
    }
}

Comment indiquer à Django que vous voulez utiliser ce fichier de configuration et non settings.py ?

Django cherche la variable d'environnement DJANGO_SETTINGS_MODULE pour connaître le module qui contient les configurations. Par défaut, il s'agit de votreprojet.settings.

Le changer est un jeu d'enfant puisque nous utilisons Supervisor !

celinems@disquaire:~/disquaire$ sudo vi /etc/supervisor/conf.d/disquaire-gunicorn.conf

Puis modifiez la ligne :

environment = DJANGO_SETTINGS_MODULE='disquaire_project.settings.production'

Indiquez à Supervisor que le fichier a été modifié :

(env) celinems@disquaire:~/disquaire$ sudo supervisorctl reread
disquaire-gunicorn: changed
(env) celinems@disquaire:~/disquaire$ sudo supervisorctl update
disquaire-gunicorn: stopped
disquaire-gunicorn: updated process group
(env) celinems@disquaire:~/disquaire$ sudo supervisorctl status
disquaire-gunicorn               RUNNING   pid 21764, uptime 0:00:09

Vous avez bien avancé et vous pouvez être fier de vous ! Dans le prochain chapitre vous apprendrez à lancer des tests avant d'envoyer en production ! 🔬

Exemple de certificat de réussite
Exemple de certificat de réussite