Django : fichiers statiques en production

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Je m'arrache les cheveux depuis ce matin avec Django et plus précisément la gestion des fichiers statiques.

En dev, tout allait pour le mieux mais dès que je désactive le debug, ça part en couille : j'ai des erreurs 404 dans tous les sens (les templates sont bien chargés, mais les fichiers statiques renvoient des erreurs 404 (alors qu'en mode dev, tout allait pour le mieux…))

Au niveau architecture, rien de bien compliqué :

  • monprojet
    • app1
    • app2
    • monprojet
    • templates
    • assets
      • css
      • img
      • fonts
    • uploads

Au niveau du settings.py :

1
2
3
4
5
6
7
8
9
STATIC_ROOT = '/home/user/projet/assets/'

STATIC_URL = '/assets/'

STATICFILES_DIRS = (
    "/home/user/projet/assets/css",
    "/home/user/projet/assets/img",
    "/home/user/projet/assets/fonts",
)

Bref, si quelqu'un sait comment je peux régler ce problème ça serait sympa (franchement le déploiement c'est vraiment prise de tête (bon, en même temps, j'en ai jamais fait)… xD Puis il faut dire aussi que je viens de PHP où, souvent, y a quasiment rien à faire à ce niveau là… :P )

Merci d'avance.

+0 -0
Auteur du sujet

Je l'ai faite et il me semble à un moment que ça a fonctionné (mais je ne sais plus si DEBUG était sur True ou False).

Et puis je vais peut être faire mon chiant mais il me semble que collectstatic recopie tous les fichiers au même endroit et j'ai l'habitude de décomposer donc ça me fout un peu les boules… :P (pour le site en question c'est largement gérable mais pour des plus gros trucs par contre, j'essaye souvent d'être un peu plus organisé) : il y a moyen de garder la structure mise en place ? (en gros des liens de type /assets/css/monfichier.css pour les fichiers css, /assets/img/monfichier.png pour les images, /assets/js/monfichier.js etc)

+0 -0
Staff

En fait il faut comprendre le fonctionnement de Django à ce niveau.

Tu as un dossier qui contient les fichiers statiques de ton projet, appelons le assets. Maintenant si tu utilises une dépendances qui contient des fichiers statiques comment fais-tu ? Tu es obligé de tout centraliser à un endroit. C'est là que la commende collectstatic est nécessaire. Essaye et regarde le résultat.

Et puis je vais peut être faire mon chiant

Que20

C'est pas une question d'être chiant ou pas, c'est une question de bien faire les choses.

"I think that it’s extraordinarily important that we in computer science keep fun in computing." – Alan J. Perlis

+0 -0
Auteur du sujet

Ben on précise les endroits où les fichiers statiques peuvent être (il me semble que c'est à ça que sert STATICFILES_DIRS).

C'est juste que ça me dérange un peu qu'on vienne chambouler l'organisation que j'avais faite au départ (parce qu'au final, elle ne sert strictement à rien). M'enfin là, j'ai qu'une dizaine de fichiers donc ça va mais si j'en avais plusieurs centaines, je me dis que ça serait intéressant des les "classer".

+0 -0

il me semble que collectstatic recopie tous les fichiers au même endroit et j'ai l'habitude de décomposer

Je pense que c'est à cause de tes settings, si tu avais :

1
2
3
STATICFILES_DIRS = (
    "/home/user/projet/assets",
)

Django garderait ton arborescence css / img / fonts

http://nodraak.fr/ – Dictateur bienveillant de l'iTeam, logiciel libre et sécurité à l'ECE Paris

+0 -0
Staff

C'est juste que ça me dérange un peu qu'on vienne chambouler l'organisation que j'avais faite au départ (parce qu'au final, elle ne sert strictement à rien).

Que20

Ça ne change absolument rien. Essaye et regarde la documentation avant de dire n'importe quoi.

"I think that it’s extraordinarily important that we in computer science keep fun in computing." – Alan J. Perlis

+1 -0
Auteur du sujet

Déso de m'être un peu emporté, c'est juste que c'est le genre de broutille qui a tendance à m'énerver quand je bloque dessus depuis des heures.

Donc si on reprend en gros :

1
2
3
4
5
STATIC_ROOT = "/home/user/projet/assets"
STATIC_URL = "/assets/"
STATICFILES_DIRS = (
    "/home/user/projet/assets",
)

C'est bien ça ? (je ne peux pas tester pour le moment)

Édité par Que20

+0 -0
Auteur du sujet

Ouaip en fait, je viens de comprendre que c'est désactivé volontairement et que ce n'est pas mon settings.py qui posait soucis : en utilisant l'option –insecure avec runserver, ça fonctionne.

https://docs.djangoproject.com/fr/1.9/ref/contrib/staticfiles/#runserver

Par contre y un truc que je ne pige pas : en quoi c'est « non sécurisé » (et « totalement inefficace »… mais contre quoi ^^ Ça la doc ne le précise pas :P ) ? Et dans ce cas, quelle est alors la bonne façon de faire ?

EDIT : Je précise aussi que je ne possède qu'un seul serveur et que je ne peux en avoir un pour le code et un autre séparé pour les fichiers donc tout sera sur le même serveur.

EDIT2 : Bon après quelques recherches, si j'ai bien compris, ça serait en fait au serveur web de faire ce boulot là en production et pas à Django. En développement, ça serait surtout là pour éviter de devoir se taper la configuration du serveur. C'est pour une question de performance ou il y a une raison particulière ? (je ne suis vraiment pas habitué à ce type de config d'où ma question)

Édité par Que20

+0 -0
Staff

C'est pour être sûr d'avoir tous tes fichiers statiques. Essaye de faire sans la bonne méthode et d’accéder à l'admin : pas de design.

"I think that it’s extraordinarily important that we in computer science keep fun in computing." – Alan J. Perlis

+0 -0
Auteur du sujet

Je ne sais pas si c'est le comportement « voulu » mais dans mon cas il a également copié les fichiers statiques de l'admin (et je ne l'avais pas précisé).

En fait, c'était pas vraiment au niveau du settings.py qu'il fallait chipoter mais au niveau de la configuration du serveur. J'ai dû rajouter ceci dans mon bloc server :

1
2
3
4
location /assets/ {
    autoindex off;
    alias /chemin/absolu/vers/le/dossier/assets/;
}

Et pouf ça fait des chocapics ! :P

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

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