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 staticssont des fichiers utiles au bon fonctionnement d'une application, ils sont fournis par le développeur de l'application.
- Les mediassont 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 collectstaticUtilisation 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.staticfilesdans la constanteINSTALLED_APPSdu fichiersettings.py de l'application.
- Il faut déclarer l'application django.contrib.staticfilesdans la constanteINSTALLED_APPSdu fichiersettings.pydu projet.