Que sont les fichiers statics et comment les mettre en prod

a marqué ce sujet comme résolu.

Bonjour ! :)

NodeJS et VueJS n’étant pas fait pour moi (ou je ne suis pas fait pour eux, c’est selon :D ), j’ai décidé de retourner sur Django. :pirate:

Je me souviens avoir eu pas mal de facilité sur ce Framework, et il faut avouer qu’il est assez puissant. Cependant, je me souviens aussi avoir eu un problème que je n’ai jamais pu résoudre avec mes recherches.

Dans Django, que sont réellement les fichiers static ? C’est mes fichiers CSS et JS ?

Aussi j’ai cru comprendre qu’en production, Django ne pouvais pas (ou ne devais pas) les "servir", mais dans ce cas, comment faire ?

Idem pour l’upload d’images par les utilisateurs/administrateur. En version dev, j’ai un dossier uploads/ et j’ai ajouté quelque chose dans le urlpatterns pour pouvoir y avoir accès. Mais c’est indiqué dans la doc que ce n’est valable qu’en version de développement, et pas en production.

Au final, je ne comprend pas grand chose à cela car je trouve peu d’informations.

Si je prend un hébergement mutualisé comme AlwaysData, comment je dois faire pour afficher les images du dossier static/ et du dossier upload ? Je dois obligatoirement uploader mes images sur des services externes, comme AWS et autre ?

Aussi, j’ai configuré STATICFILES_DIRS et STATIC_ROOT (ou quelque chose comme ça) dans le même dossier, et j’ai le droit à une erreur indiquant que ces deux variables ne peuvent pointer vers le même dossier.

A part ces quelques petites choses, je trouve Django bien plus simple et c’est assez agréable de l’utiliser. 'me manque plus que ça ! :D

Merci !

+0 -0

Salut,

En effet, il s’agit des fichiers pour lesquels Django n’a aucun traitement à faire : des fichiers présents sur le disque et qu’il faut renvoyer comme tels. Outre les fichiers CSS et JS, les images sont aussi concernées.

Django peut les servir (il le fait en test), mais il n’est pas conseillé de l’utiliser pour cela en production. Parce que si Django n’a rien à faire de ces fichiers, c’est une perte de temps de passer par lui (traitement de la requête + je ne pense pas qu’il ait de mécanisme de cache pour ces fichiers).

Donc en production, il est plutôt recommandé de gérer ces fichiers dans la configuration du serveur web. Je ne sais plus exactement comment fonctionne AlwaysData, mais dans l’idée où il y aurait un fichier de configuration nginx que tu peux éditer, il faudrait ajouter une route pour servir statiquement ces fichiers.

Et non, rien ne t’oblige à utiliser des services externes, ces ressources statiques peuvent être sur le même serveur.

Django fonctionne en applications et chaque application peut avoir ses propres fichiers statiques. Par exemple l’interface d’administration (django.contrib.admin) a ses fichiers statiques. Django va récupérer touts les fichiers disponibles et les mettre au même endroit.

Les variables de configuration sont les suivantes :

  • STATIC_URL : url où seront disponibles les fichiers statiques. En général on la sert directement via le serveur web. On peut aussi utiliser un CDN (voir plus bas).
  • STATICFILES_DIRS : une liste d’endroits où se trouvent les fichiers statiques de ton projet.
  • STATICFILES_FINDERS : Par défaut elle vaut ['xxx.FileSystemFinder','xxx.AppDirectoriesFinder',] (où xxx = 'django.contrib.staticfiles.finders') ce qui permet de bien voir que les fichiers récupérés vont l’être dans ton système de fichier via la variable STATICFILES_DIRS et via les application chargées dans ton projet si elles disposent de fichiers statiques.
  • STATIC_ROOT : l’endroit où seront stockés les fichiers récupérés.
  • STATICFILES_STORAGE : la manière de stocker les fichier. C’est ici qu’il faut modifier la valeur pour utilise.

Pour une configuration simple, je te conseille de configurer les variables suivantes :

STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'assets',)  # où 'assets' contient tes fichiers statiques par exemple
STATIC_ROOT = os.path.join(BASE_DIR, 'static'  # c'est donc un répertoire que django va créer

Donc en gros Django va fonctionner comme cela lorsque tu lancer la commande python manage.py compilestatic :

  1. Il regarde la variable STATICFILES_FINDERS pour savoir ce qu’il doit récupérer. On prend ici l’exmple de la valeur par défaut.
  2. Avec AppDirectoriesFinder il récupère tous les fichiers statiques de tes appplications installées (l’admin django, des dépendances autres, etc).
  3. Avec FileSystemFinder il va récupérer les fichiers disponibles via la variable STATICFILES_DIRS
  4. Il regarde comment stocker les fichiers via la variable STATICFILES_STORAGE
  5. Ici, avec la valeur StaticFilesStorage, il va juste copier les fichiers vers un répertoire local à savoir la valeur de STATIC_ROOT

Plus d’informations : https://docs.djangoproject.com/fr/2.2/howto/static-files/deployment/

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte