web-dev-qa-db-fra.com

Quel est l'intérêt de collectstatic de Django?

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?

65
user5732453

Recueillir des fichiers statiques de plusieurs applications dans un seul chemin

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.

URL persistantes avec ManifestStaticFilesStorage

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.

55
bakkal

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:

  • trouver tous les fichiers statiques de chaque application
  • construire un seul répertoire qui les contient tous
  • les télécharger quelque part (un répertoire static sur votre serveur Web ou un stockage de fichier tiers)
  • configurez votre serveur Web (tel que nginx) pour servir /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.

33
Kos

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.

21
Mikko Ohtamaa

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.

6
aa333