Fichiers statiques et médias : collecte et gestion pérenne avec Django
Static vs. media
On distinguera les fichiers statiques des fichiers de type media :
- Les
statics
sont des fichiers utiles au bon fonctionnement d'une application, ils sont fournis par le développeur de l'application. - Les
medias
sont des fichiers « uploadés » par les utilisateurs, via des formulaires de l'application.
Dans les applications web, ces fichiers sont placés dans des répertoires situés dans le « www » : en d'autres termes, on les place dans un répertoire accessible directement par le serveur web (Lighttpd, Apache, NGinx…).
django.contrib.staticfiles
Django vient avec une application dédiée à la gestion des fichiers statics et medias : django.contrib.staticfiles
. Cette application nous permettra de placer nos fichiers statiques dans les répertoires de chacune de nos applications (par exemple pour les distribuer plus simplement) : c'est elle qui se chargera ensuite de les copier dans un répertoire accessible au public.
Paramégtrage dans le fichier settings.py
Pour permettre à l'application django.contrib.staticfiles
de tourner, il faut l'activer dans le fichier settings.py
, et lui fournir quelques paramètres utiles.
INSTALLED_APPS = (
#...
'django.contrib.staticfiles',
)
STATIC_URL = '/static/'
STATIC_ROOT = '/home/www/mon_appli/collected_statics/'
STATICFILES_DIRS = (
'/home/django/mon_appli/static/',
)
La collecte des fichiers statiques
L'application django.contrib.staticfiles
fonctionne simplement : une fois paramétrée, elle nous permet de rapatrier l'ensemble de tous les fichiers statiques de toutes les applications utilisées dans un projet en exécutant une commande :
python manage.py collectstatic
Utilisation dans les vues (templates)
Une fois collectés, les fichiers statiques peuvent être simplement utilisés dans les templates de manière simple et DRY :
mon_template.py{% load staticfiles %}
<img src="{% static "mon_application/mom_image.jpg" %}" alt="Mon image" />
<img src="{{ STATIC_URL }}mon_application/mom_image.jpg" alt="Mon image" />
Le tag static
générera automatiquement les URL appropriées pour tous les fichiers statiques !
Test de connaisances
- Servir des images et servir une applciation Python n'est pas du tout la même problématique, et des configurations serveurs différentes sont généralement nécessaires pour en optimiser les temps de réponses respectifs.
- C'est inutile : on peut très bien placer son code applicatif au même endroit que les fichiers statiques sans aucun scrupule !
- Quand on doit desservir 40 millions d'images pour une application, on a généralement envie de déployer ces images sur un serveur différent de celui qui exécute Django.
- Le fait de pouvoir collecter simplement dans un projet tous les fichiers statiques de toutes les applications est un gage de modularité et de simplicité dans la distribution des applications.
- C'est une application comme les autres.
- Il suffit de la télécharger en plus de Django et de l'installer.
- Il faut déclarer l'application
django.contrib.staticfiles
dans la constanteINSTALLED_APPS
du fichiersettings.p
y de l'application. - Il faut déclarer l'application
django.contrib.staticfiles
dans la constanteINSTALLED_APPS
du fichiersettings.py
du projet.