C'est probablement une question stupide, mais c'est juste que je ne clique pas dans ma tête.
Dans Django, la convention est de placer tous vos fichiers statiques (c'est-à-dire css, js) spécifiques à votre application dans un dossier appelé static. Donc, la structure ressemblerait à ceci:
mysite/
manage.py
mysite/ --> (settings.py, etc)
myapp/ --> (models.py, views.py, etc)
static/
Dans mysite/settings.py, j'ai:
STATIC_ROOT = 'staticfiles'
Alors quand je lance la commande:
python manage.py collectstatic
Il crée un dossier appelé staticfiles au niveau racine (donc même répertoire que myapp /)
Quel est le but de ceci? N’est-ce pas simplement créer une copie de tous mes fichiers statiques?
Eh bien, un seul Django projet peut utiliser plusieurs applications , alors que vous n’avez qu’un seul myapp
, c’est peut-être en fait myapp1
, myapp2
, etc
En les copiant depuis les applications individuelles dans un seul dossier, vous pouvez diriger votre serveur Web frontal (par exemple, nginx) vers ce dossier unique STATIC_ROOT
et servir des fichiers statiques à partir d’un seul emplacement, plutôt que de configurer votre serveur Web pour servir des fichiers statiques à partir de plusieurs chemins.
Une note à propos du hachage MD5 ajouté au nom de fichier pour le contrôle de version: cela ne fait pas partie du comportement par défaut de collectstatic
, comme settings.STATICFILES_STORAGE
_ par défaut à StaticFilesStorage
(ce qui ne le fait pas)
Le hachage MD5 entrera en jeu, par exemple. si vous le configurez pour utiliser ManifestStaticFilesStorage
, qui annonce ce comportement.
Le but de ce stockage est de continuer à servir les anciens fichiers au cas où certaines pages feraient encore référence à ces fichiers, par exemple. parce qu'ils sont mis en cache par vous ou par un serveur proxy tiers. En outre, il est très utile d’appliquer des en-têtes Expires futurs aux fichiers déployés pour accélérer le temps de chargement des visites de page ultérieures.
Les fichiers statiques Django peuvent se trouver à plusieurs endroits. Un fichier qui est servi en tant que /static/img/icon.png
pourrait venir de plusieurs endroits . Par défaut:
FileSystemFinder
cherchera img/icon.png
Dans chacun de STATICFILES_DIRS
,AppDirectoriesFinder
cherchera img/icon.png
dans le sous-dossier static
de chacun de vos INSTALLED_APPS
. Cela permet aux bibliothèques comme Django Admin d’ajouter leurs propres fichiers statiques à votre application.Maintenant: cela ne fonctionne que si vous exécutez manage.py runserver
avec DEBUG = 1. Lorsque vous allez en ligne, le processus Django ne servira plus les actifs statiques. Il serait inefficace d'utiliser Django pour les servir, il existe des outils plus spécialisés. spécifiquement pour cela.
Au lieu de cela, vous devriez faire quelque chose comme ceci:
static
sur votre serveur Web ou un stockage de fichier tiers)/static/*
directement à partir de ce répertoire et redirigez toute autre demande vers Django.collectstatic
est un script prêt à l'emploi qui prépare ce répertoire pour vous, afin que vous puissiez le connecter directement à votre script de déploiement.
Dans l'installation de production, vous voulez avoir des URL persistantes. L'URL ne change pas sauf si le contenu du fichier est modifié.
Cela évite que les clients aient une version incorrecte du fichier CSS ou JS sur leur ordinateur lors de l'ouverture d'une page Web à partir de Django. Django staticfiles détecte les modifications de fichier et met à jour les URL en conséquence, de sorte que si le fichier CSS ou JS change, le navigateur Web télécharge la nouvelle version.
Ceci est généralement réalisé en ajoutant un hachage MD5 au nom du fichier lors de l'exécution de collectstatic
.
Modifier: voir également la réponse associée à plusieurs applications.
C'est utile quand il y a plusieurs Django applications sur le site.
collectstatic
va ensuite collecter les fichiers statiques de toutes les applications en un seul endroit - afin de pouvoir les servir dans un environnement de production.