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 trackerproduction.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 ! 🔬