L’application de gestion des fichiers statiques (staticfiles)Lien vers cette rubrique

django.contrib.staticfiles recueille les fichiers statiques à partir de chacune des applications (et de tous les autres endroits que vous spécifiez) en un seul endroit qui peut facilement être utilisé en production.

RéglagesLien vers cette rubrique

Voir réglages de staticfiles pour plus de détails sur les réglages suivants :

Commandes d’administrationLien vers cette rubrique

django.contrib.staticfiles propose trois commandes d’administration.

collectstaticLien vers cette rubrique

django-admin collectstaticLien vers cette définition

Recueille les fichiers statiques dans le répertoire STATIC_ROOT.

Lorsque deux fichiers ont le même nom, le problème est résolu par défaut d’une façon similaire à la façon dont fonctionne la résolution des gabarits : le premier fichier trouvé est utilisé. En cas d’incertitude, la commande findstatic peut vous montrer quels sont les fichiers trouvés.

Lors des prochains lancements de collectstatic (si STATIC_ROOT n’est pas vide), les fichiers ne sont copiés que si leur date de modification est plus récente que la date de modification du fichier dans STATIC_ROOT. Ainsi, si vous supprimez une application de INSTALLED_APPS, il est recommandé d’utiliser l’option collectstatic --clear afin de supprimer les fichiers statiques obsolètes.

La recherche des fichiers utilise le réglage STATICFILES_FINDERS. Par défaut, Django parcourt tous les emplacements définis dans STATICFILES_DIRS et dans le répertoire 'static' des applications figurant dans le réglage INSTALLED_APPS .

La commande d’administration collectstatic appelle la méthode post_process() du système de stockage STATICFILES_STORAGE après chacune de ses exécutions et lui passe une liste des chemins qu’elle a trouvés. La méthode reçoit également toutes les options de ligne de commande de collectstatic. C’est utilisé par la classe ManifestStaticFilesStorage par défaut.

Par défaut, les fichiers collectés reçoivent les autorisations du réglage FILE_UPLOAD_PERMISSIONS et les répertoires reçoivent les autorisations de FILE_UPLOAD_DIRECTORY_PERMISSIONS. Si vous souhaitez des autorisations différentes pour ces fichiers ou répertoires, vous pouvez créer une sous-classe des classes de stockage des fichiers statiques et spécifier les paramètres file_permissions_mode ou directory_permissions_mode. Par exemple :

Code
from django.contrib.staticfiles import storage

class MyStaticFilesStorage(storage.StaticFilesStorage):
    def __init__(self, *args, **kwargs):
        kwargs['file_permissions_mode'] = 0o640
        kwargs['directory_permissions_mode'] = 0o760
        super().__init__(*args, **kwargs)

Définissez ensuite le réglage STATICFILES_STORAGE à 'chemin.vers.MyStaticFilesStorage'.

Certaines options couramment utilisées sont :

--noinput, --no-inputLien vers cette définition

Ne pose AUCUNE question à l’utilisateur.

--ignore PATTERN, -i PATTERNLien vers cette définition

Ignore les fichiers, les répertoires ou les chemins correspondant à ce motif de style « glob ». Peut être utilisé plusieurs fois pour ignorer plusieurs chemins. Si vous indiquez un chemin, utilisez toujours des barres obliques normales, même sur Windows.

--dry-run, -nLien vers cette définition

Exécute la commande normalement, mais sans toucher réellement au système de fichiers.

--clear, -cLien vers cette définition

Efface les fichiers existants avant d’essayer de copier ou de lier le fichier d’origine.

Crée un lien symbolique vers chaque fichier au lieu de copier.

--no-post-processLien vers cette définition

N’appelle pas la méthode post_process() du moteur de stockage configuré dans STATICFILES_STORAGE.

--no-default-ignoreLien vers cette définition

N’ignore pas les motifs de style « glob » `` “CVS”, ``'.*' et '*~' qui sont normalement toujours ignorés.

Pour une liste complète des options, reportez-vous à l’aide des commandes elles-mêmes en exécutant :

Linux / macOS

Shell
$ python manage.py collectstatic --help

Windows

Windows
...\> py manage.py collectstatic --help

Personnalisation de la liste des motifs ignorésLien vers cette rubrique

La liste des motifs ignorés par défaut, ['CVS', '.*', '*~'], peut être personnalisée de manière plus permanente que de fournir l’option en ligne de commande --ignore lors de chaque invocation de collectstatic. Ajoutez une classe AppConfig personnalisée, surchargez l’attribut ignore_patterns de la classe et remplacez 'django.contrib.staticfiles' dans le réglage INSTALLED_APPS par le chemin de cette classe :

Python
from django.contrib.staticfiles.apps import StaticFilesConfig

class MyStaticFilesConfig(StaticFilesConfig):
    ignore_patterns = [...]  # your custom ignore list

findstaticLien vers cette rubrique

django-admin findstatic staticfile [staticfile ...]Lien vers cette définition

Recherche un ou plusieurs chemins relatifs en fonction des chercheurs activés.

Par exemple :

Linux / macOS

Shell
$ python manage.py findstatic css/base.css admin/js/core.js
Found 'css/base.css' here:
  /home/special.polls.com/core/static/css/base.css
  /home/polls.com/core/static/css/base.css
Found 'admin/js/core.js' here:
  /home/polls.com/src/django/contrib/admin/media/js/core.js

Windows

Windows
...\> py manage.py findstatic css\base.css admin\js\core.js
Found 'css/base.css' here:
  /home/special.polls.com/core/static/css/base.css
  /home/polls.com/core/static/css/base.css
Found 'admin/js/core.js' here:
  /home/polls.com/src/django/contrib/admin/media/js/core.js
findstatic --firstLien vers cette définition

Par défaut, tous les emplacements trouvés sont utilisés. Pour ne renvoyer que le premier chemin relatif trouvé, utilisez l’option --first:

Linux / macOS

Shell
$ python manage.py findstatic css/base.css --first
Found 'css/base.css' here:
  /home/special.polls.com/core/static/css/base.css

Windows

Windows
...\> py manage.py findstatic css\base.css --first
Found 'css/base.css' here:
  /home/special.polls.com/core/static/css/base.css

Il s’agit d’une outil de débogage ; vous verrez exactement quel fichier statique sera trouvé pour un chemin donné.

En mettant le drapeau --verbosity à 0, vous pouvez supprimer les explications complémentaires et obtenir uniquement les noms de chemins :

Linux / macOS

Shell
$ python manage.py findstatic css/base.css --verbosity 0
/home/special.polls.com/core/static/css/base.css
/home/polls.com/core/static/css/base.css

Windows

Windows
...\> py manage.py findstatic css\base.css --verbosity 0
/home/special.polls.com/core/static/css/base.css
/home/polls.com/core/static/css/base.css

D’autre part, en mettant l’option --verbosity à 2, vous pouvez obtenir la liste de tous les répertoires qui ont été recherchés :

Linux / macOS

Shell
$ python manage.py findstatic css/base.css --verbosity 2
Found 'css/base.css' here:
  /home/special.polls.com/core/static/css/base.css
  /home/polls.com/core/static/css/base.css
Looking in the following locations:
  /home/special.polls.com/core/static
  /home/polls.com/core/static
  /some/other/path/static

Windows

Windows
...\> py manage.py findstatic css\base.css --verbosity 2
Found 'css/base.css' here:
  /home/special.polls.com/core/static/css/base.css
  /home/polls.com/core/static/css/base.css
Looking in the following locations:
  /home/special.polls.com/core/static
  /home/polls.com/core/static
  /some/other/path/static

runserverLien vers cette rubrique

django-admin runserver [addrport]

Remplace la commande de base runserver si l’application staticfiles est installée, et ajoute automatiquement le service des fichiers statiques. Le service des fichiers n’utilise pas le réglage MIDDLEWARE.

La commande ajoute ces options :

--nostaticLien vers cette définition

Utilisez l’option --nostatic pour désactiver entièrement le service des fichiers statiques avec l’application staticfiles. Cette option n’est disponible que si l’application staticfiles fait partie du réglage INSTALLED_APPS de votre projet.

Exemple d’utilisation :

Linux / macOS

Shell
$ django-admin runserver --nostatic

Windows

Windows
...\> django-admin runserver --nostatic
--insecureLien vers cette définition

Utilisez l’option --insecure pour forcer le service des fichiers statiques avec l’application staticfiles même quand le réglage DEBUG est à False. En utilisant cette option, vous reconnaissez le fait que c’est totalement inefficace et très probablement non sécurisé. Cette option est uniquement destinée au développement en local et ne devrait jamais être utilisée en production. Elle n’est disponible que si l’application staticfiles se trouve dans le réglage INSTALLED_APPS de votre projet.

--insecure ne fonctionne pas avec ManifestStaticFilesStorage.

Exemple d’utilisation :

Linux / macOS

Shell
$ django-admin runserver --insecure

Windows

Windows
...\> django-admin runserver --insecure

StockagesLien vers cette rubrique

StaticFilesStorageLien vers cette rubrique

class storage.StaticFilesStorageLien vers cette définition

Une sous-classe du moteur de stockage FileSystemStorage qui utilise le réglage STATIC_ROOT comme emplacement de base dans le système de fichiers et le réglage STATIC_URL comme URL de base.

storage.StaticFilesStorage.post_process(paths, **options)Lien vers cette définition

Si cette méthode est définie pour un stockage, elle est appelée par la commande de gestion collectstatic après chaque exécution et reçoit les stockages locaux et les chemins des fichiers trouvés sous forme de dictionnaire, de même que les options de la ligne de commande. Elle renvoie des tuples de trois valeurs : chemin_original, chemin_traité, traité. Les valeurs de chemins sont des chaînes et traité est un booléen indiquant si la valeur a reçu un post-traitement, ou une exception si le post-traitement a échoué.

Le stockage ManifestStaticFilesStorage utilise cette classe en coulisses pour remplacer les chemins par leur équivalent « haché » et mettre à jour le cache de manière appropriée.

ManifestStaticFilesStorageLien vers cette rubrique

class storage.ManifestStaticFilesStorageLien vers cette définition

Une sous-classe du moteur de stockage StaticFilesStorage qui modifie les noms des fichiers qu’elle traite en ajoutant le hachage MD5 du contenu du fichier au nom de fichier. Par exemple, le fichier css/styles.css serait également enregistré en tant que css/styles.55e7cbb9ba48.css.

Le but de ce stockage est de continuer à servir les anciens fichiers au cas où certaines pages se réfèrent encore à ces fichiers, par exemple parce qu’elles sont mises en cache par vous-même ou un serveur mandataire externe. En outre, cela est très utile si vous souhaitez appliquer des en-têtes à date d’expiration très lointaine aux fichiers déployés pour accélérer le temps de chargement des pages lors des visites ultérieures.

Le moteur de stockage remplace automatiquement dans les fichiers enregistrés les chemins qui correspondent aux autres fichiers enregistrés par les chemins des copies en cache (en utilisant la méthode post_process()). Les expressions régulières utilisées pour rechercher ces chemins (django.contrib.staticfiles.storage.HashedFilesMixin.patterns) couvrent par défaut la règle @import et l’instruction url() des feuilles de style CSS. Par exemple, le fichier 'css/styles.css' avec le contenu

Css
@import url("../admin/css/base.css");

serait remplacé par l’appel de la méthode url() du moteur de stockage ManifestStaticFilesStorage, enregistrant finalement un fichier 'css/styles.55e7cbb9ba48.css' avec le contenu suivant :

Css
@import url("../admin/css/base.27e20196a850.css");
storage.ManifestStaticFilesStorage.max_post_process_passesLien vers cette définition

Comme les fichiers statiques peuvent se référer à d’autres fichiers statiques qui ont besoin d’un remplacement de chemins, plusieurs passes de remplacements de chemins peuvent être nécessaires jusqu’à ce que les hachages de fichier convergent. Pour éviter une boucle sans fin en raison de hachages non convergeant (par exemple, si 'foo.css' se réfère à 'bar.css' qui référence 'foo.css'), un nombre maximum de passes est défini avant qu’un post-traitement soit abandonné. Dans le cas d’un nombre de références élevé, il pourrait être nécessaire d’augmenter ce nombre de passes. Ceci peut se faire en créant une sous-classe de ManifestStaticFilesStorage et en définissant l’attribut max_post_process_passes. Sa valeur par défaut est 5.

Pour activer le stockage ManifestStaticFilesStorage, vous devez vous assurer que les conditions suivantes sont remplies :

  • le réglage STATICFILES_STORAGE contient 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

  • le réglage DEBUG contient False

  • vous avez recueilli tous les fichiers statiques en utilisant la commande d’administration collectstatic

Comme la création du hachage MD5 peut diminuer la performance de votre site Web, staticfiles stocke automatiquement la correspondance des noms hachés pour chaque fichier traité dans un fichier nommé staticfiles.json. Cela se produit une seule fois au moment où vous exécutez la commande collectstatic.

storage.ManifestStaticFilesStorage.manifest_strictLien vers cette définition

Si un fichier n’est pas trouvé dans le manifeste staticfiles.json lors de l’exécution, une exception ValueError est générée. Ce comportement peut être désactivé en créant une sous-classe de ManifestStaticFilesStorage et en définissant l’attribut manifest_strict à False – les chemins non existants seront laissés inchangés.

Comme il faut que la commande collectstatic ait été lancée, ce stockage ne doit normalement pas être utilisé lors de l’exécution des tests car collectstatic n’est pas exécutée dans une configuration de test normale. Lors des tests, vérifiez que le réglage STATICFILES_STORAGE est défini sur autre chose, comme par exemple la valeur par défaut 'django.contrib.staticfiles.storage.StaticFilesStorage'.

storage.ManifestStaticFilesStorage.file_hash(name, content=None)Lien vers cette définition

La méthode utilisée lors de la création du nom haché d’un fichier. Doit renvoyer une empreinte de hachage pour le nom de fichier donné et son contenu. Par défaut, on calcule un hachage MD5 à partir du contenu comme mentionné ci-dessus. N’hésitez pas à redéfinir cette méthode pour utiliser votre propre algorithme de hachage.

CachedStaticFilesStorageLien vers cette rubrique

class storage.CachedStaticFilesStorageLien vers cette définition

CachedStaticFilesStorage est une classe semblable à la classe ManifestStaticFilesStorage mais utilise l”infrastructure de cache de Django pour stocker les noms hachés des fichiers traités au lieu d’un fichier manifeste statique nommé staticfiles.json. C’est surtout utile dans les situations dans lesquelles vous n’avez pas accès au système de fichiers.

Si vous souhaitez remplacer certaines options du moteur de cache utilisé pour le stockage, il vous suffit de spécifier une entrée particulière dans le réglage CACHES en la nommant 'staticfiles'. Par défaut, c’est le moteur de cache 'default' qui est utilisé.

ManifestFilesMixinLien vers cette rubrique

class storage.ManifestFilesMixinLien vers cette définition

Utilisez cette classe mixin avec un stockage personnalisé pour ajouter au nom de fichier une empreinte MD5 du contenu du fichier, comme le fait ManifestStaticFilesStorage.

Le module findersLien vers cette rubrique

Le module finders (découverte des fichiers statiques) de staticfiles possède un attribut searched_locations qui est une liste de chemins de répertoires dans lesquels des fichiers statiques ont été recherchés. Exemple d’utilisation :

Code
from django.contrib.staticfiles import finders

result = finders.find('css/base.css')
searched_locations = finders.searched_locations

Autres utilitairesLien vers cette rubrique

Il existe quelques autres utilitaires en plus de l’application staticfiles pour gérer les fichiers statiques :

Vue pour l’utilisation des fichiers statiques en développementLien vers cette rubrique

Les outils concernant les fichiers statiques sont principalement conçus pour aider à déployer correctement les fichiers statiques en production. Cela implique généralement de dédier un serveur distinct pour les fichiers statiques, ce qui induit de trop nombreuses actions supplémentaires lorsque l’on développe en local sur un environnement de développement. Ainsi, l’application staticfiles est fournie avec une vue à la va-vite que vous pouvez utiliser pour s’occuper du service des fichiers lors du développement local.

views.serve(request, path)Lien vers cette définition

Cette fonction de vue sert les fichiers statiques lors du développement.

Cette vue est automatiquement activée par runserver (avec le réglage DEBUG à True). Pour utiliser la vue avec un autre serveur de développement local, ajoutez le code suivant à la fin de la configuration d’URL principale :

Code
from django.conf import settings
from django.contrib.staticfiles import views
from django.urls import re_path

if settings.DEBUG:
    urlpatterns += [
        re_path(r'^static/(?P<path>.*)$', views.serve),
    ]

Remarque : le début du motif (r'^static/') devrait correspondre au réglage STATIC_URL.

Comme c’est un peu fastidieux, il existe aussi une fonction utilitaire qui fait cela pour vous :

urls.staticfiles_urlpatterns()Lien vers cette définition

Cela renvoie le motif d’URL approprié pour servir les fichiers statiques et peut être ajouté à la liste de motifs d’URL déjà définie. Utilisez-la comme ceci :

Code
from django.contrib.staticfiles.urls import staticfiles_urlpatterns

# ... the rest of your URLconf here ...

urlpatterns += staticfiles_urlpatterns()

Cette fonction examine le réglage STATIC_URL et connecte la vue de service des fichiers statiques en conséquence. N’oubliez pas de définir le réglage STATICFILES_DIRS approprié pour faire savoir à django.contrib.staticfiles où rechercher les fichiers en plus des fichiers dans les répertoires des applications.

Cas de test particulier pour permettre le « test en live »Lien vers cette rubrique

class testing.StaticLiveServerTestCaseLien vers cette définition

Cette sous-classe de test unitaire TestCase hérite de django.test.LiveServerTestCase.

Tout comme sa classe parente, vous pouvez l’utiliser pour écrire des tests qui impliquent le fonctionnement du code testé et de son exploitation par des outils de test à travers HTTP (par ex. Selenium, PhantomJS, etc.), et pour lesquels il est nécessaire que les fichiers statiques soient également disponibles.

Mais étant donné qu’elle fait appel à la vue django.contrib.staticfiles.views.serve() présentée plus haut, elle peut servir de manière transparente au moment de l’exécution des tests les ressources statiques mises à disposition par le moteur de découverte de staticfiles. Cela signifie que vous n’avez pas besoin de lancer collectstatic préalablement ou dans le cadre de la configuration des tests.