Déploiement d'applications Django : exemple sur serveur Linux/Apache
Déployer : qu'est-ce que ça veut dire ?
Déployer une application, la mettre en production, signifie la rendre disponible aux utilisateurs via un serveur accessible depuis Internet ou un autre réseau (pour les applications privées, notamment en entreprise).
Généralement, des outils de versionning, d'intégration continue, etc. sont utilisés dans ce processus : ils dépassent le cadre de ce cours, et ne seront donc pas abordés ici.
Pré-requis pour le déploiement Django
Bien entendu, avant toute chose vous devez disposer d'un serveur connecté, sur lequel vous installerez un serveur logiciel comme Apache : c'est ce serveur que nous utiliserons car il est populaire et robuste. Mais d'autres solutions existent, comme par exemple Gunicorn.
Assurez-vous que Django est installé sur le serveur (sous Debian sudo apt-get install django
).
Organisation des fichiers
Bien entendu, il est conseillé de séparer sur votre serveur les sources de votre projet Django et les fichiers statics et medias. Dans l'idéal, utilisez plusieurs serveurs : un pour les applications, un autre pour les assets.
Si vous ne disposez que d'un serveur :
- Créez quelque part en lieu sûr et non accessible par Apache un dossier
django/mon_projet/
, dans lequel vous copierez l'ensemble de vos sources. - Créez dans un endroit accessible par Apache un répertoire
www/django/mon_projet/
, qui comportera trois sous répertoires :static
,media
etapache
.
Paramétrage d'Apache
Dans le répertoire de paramétrage d'Apache (généralement /etc/apache2/
), ajoutez un nouveau site dans les sites-availables
. Pour cela, créez un fichier dans ce répertoire, quez vous nommerez par exemple mon_projet
(création d'un virtual host). Placez-y quelque chose comme ceci :
<VirtualHost *:80>
ServerName votre-domaine.fr
ServerAlias www.votre-domaine.fr
ServerAdmin webmaster@votre-domaine.fr
Alias /static/ [chemin vers votre répertoire public]/www/django/mon_projet/static/
Alias /media/ [chemin vers votre répertoire public]/www/django/mon_projet/media/
<Directory [chemin vers votre répertoire public]/www/django/mon_projet/static/>
Options -Indexes FollowSymLinks MultiViews
Order deny,allow
Allow from all
</Directory>
<Directory [chemin vers votre répertoire public]/www/django/mon_projet/media/>
Options -Indexes FollowSymLinks MultiViews
Order deny,allow
Allow from all
</Directory>
WSGIScriptAlias / [chemin vers votre répertoire public]/www/django/mon_projet/apache/django.wsgi
<Directory [chemin vers votre répertoire public]/www/django/mon_projet/apache>
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
Ce paramétrage d'Apache a pour effet de rediriger toutes les requêtes entrantes sur notre domaine vers une sorte de « super contrôleur frontal » nommé django.wsgi
, qui redirigera à son tour vers le fameux urls.py
que l'on a vu précédemment. Voici un exemple de contenu pour ce fichier :
import os
import sys
os.environ['DJANGO_SETTINGS_MODULE'] = 'mon_projet.settings'
path = '[chemin vers votre répertoire privé]/django/mon_projet'
if path not in sys.path:
sys.path.append(path)
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Dernières petites choses à régler…
OK, à présent les requêtes sont bien dirigées vers l'application !
Il vous restera à bien paramétrer le fichier settings.py
de votre projet pour y mentionner les bons répertoires pour les fichiers statics, medias, etc. Ceci vous permettra ensuite d'exécuter la commande python manage.py collectstatic
.
De même, il vous faudra bien évidemment installer et paramétrer votre SGBD (par exemple MySQL), et en décrire les données de connexion dans le fichier settings.py
.
Enfin, n'oubliez pas de désactiver le mode debug en production :
settings.pyDEBUG = False
Après désactivation du mode debug, les erreurs qui surviendront éventuellement en production ne présenteront plus aucun détail (dangereux en matière de sécurité), mais vous recevrez ces informations de debug par mail (à l'adresse mail que vous avez configuré dans le fichier settings.py, constante ADMINS
).