Fichiers statiques et médias : collecte et gestion pérenne avec Django

Les applications web doivent toutes stocker et utiliser des fichiers statiques (assets, media) : images, scripts Javascript, feuilles de style CSS, etc. Django vient avec quelques fonctionnalités pratiques pour la gestion de ces fichiers.

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.

settings.py
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

Pourquoi toutes ces histoires de fichiers statiques à gérer à part du code applicatif ?
  • 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.
Comment fonctionne Django staticfiles ?
  • 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 constante INSTALLED_APPS du fichier settings.py de l'application.
  • Il faut déclarer l'application django.contrib.staticfiles dans la constante INSTALLED_APPS du fichier settings.py du projet.