Différence entre STATIC_URL statique et STATIC_ROOT sur Django

127

Je suis confus static rootet je veux clarifier les choses.

Pour servir des fichiers statiques dans Django, les éléments suivants doivent être dans settings.pyet urls.py:

import os
PROJECT_DIR=os.path.dirname(__file__)

1. Chemin absolu vers le répertoire dans lequel les fichiers statiques doivent être collectés

STATIC_ROOT= os.path.join(PROJECT_DIR,'static_media/')

2. Préfixe d'URL pour les fichiers statiques

STATIC_URL = '/static/'

3. Emplacements supplémentaires pour les fichiers statiques

STATICFILES_DIRS = ( os.path.join(PROJECT_DIR,'static/'),)

... et dans urls.pyles lignes suivantes:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += patterns('', (
    r'^static/(?P<path>.*)$',
    'django.views.static.serve',
    {'document_root': settings.STATIC_ROOT}
))

4. Nous utilisons également python manage.py collectstatic

Des questions:

  1. Quelqu'un pourrait-il m'expliquer le flux de travail: comment les choses devraient-elles idéalement être faites? À partir de maintenant, je copie / colle les extraits de code ci-dessus dans leurs emplacements désignés et continue à créer de nouveaux fichiers dans le répertoire statique et cela fonctionne. Dans mon settings.STATIC_ROOT, cependant, j'ai indiqué un répertoire différent.

  2. Ce serait formidable si quelqu'un pouvait expliquer le flux de travail de chaque paramètre: comment les fichiers sont collectés et gérés, et quelle serait une bonne pratique à suivre.

Merci.

user993563
la source
Pourriez-vous clarifier ce que vous entendez par «expliquer le flux de travail»? aussi vos modèles d'url devraient être conditionnels si vous développez dans la partie 3. vous pouvez le faire en ajoutant que if settings.DEBUG:django n'est pas très bon pour servir des médias statiques, cela devrait être laissé à un vrai serveur Web.
dm03514
Salut @ user993563 je ne peux même pas trouver la solution dans plusieurs forums ce que je veux. mais vos questions l'expliquent clairement merci mec ... excellent travail ...
Mohideen bin Mohammed
Bonne explication, merci
Ajay Kumar

Réponses:

89

STATIC_ROOT

Le chemin absolu vers le répertoire dans lequel ./manage.py collectstaticcollecteront les fichiers statiques pour le déploiement. Exemple:STATIC_ROOT="/var/www/example.com/static/"

maintenant, la commande ./manage.py collectstaticcopiera tous les fichiers statiques (c'est-à-dire dans le dossier statique de vos applications, les fichiers statiques dans tous les chemins) dans le répertoire /var/www/example.com/static/. il ne vous reste plus qu'à servir ce répertoire sur apache ou nginx..etc.

STATIC_URL

Le URLdont les fichiers statiques dans le STATIC_ROOTrépertoire sont servis (par Apache ou nginx..etc). Exemple: /static/ouhttp://static.example.com/

Si vous définissez STATIC_URL = 'http://static.example.com/', vous devez servir le STATIC_ROOTdossier (c'est-à-dire "/var/www/example.com/static/") par apache ou nginx à l'url 'http://static.example.com/'(afin que vous puissiez référencer le fichier statique '/var/www/example.com/static/jquery.js'avec 'http://static.example.com/jquery.js')

Maintenant, dans vos django-templates, vous pouvez le référencer par:

{% load static %}
<script src="{% static "jquery.js" %}"></script>

qui rendra:

<script src="http://static.example.com/jquery.js"></script>
suhailvs
la source
1
Quelle est la différence entre votre exemple et celui-ci: href = "{% static" jquery.js "%}"
Utilisateur
8
@macdonjo les deux {{ STATIC_URL }}jquery.jset {% static "jquery.js" %}sont identiques. c'est à dire que les deux reviendront /static/jquery.js. Les nouvelles versions de django recommandent d'utiliser {% static "jquery.js" %}, mais vous devez charger le templatetag, ie {% load staticfiles %}. dans l' ancienne version de django recommande{{STATIC_URL}}
suhailvs
Je vois. J'essayais de trouver un bogue qui faisait que la plupart de mes modèles chargeaient ma feuille de style à l'exception d'une page. Je l'ai changé en staticméthode au lieu de STATIC_URLméthode, et le bogue a disparu. Bon appel sur les suggestions basées sur les versions.
Utilisateur le
37

STATICFILES_DIRS: Vous pouvez conserver ici les fichiers statiques de votre projet, par exemple ceux utilisés par vos modèles.

STATIC_ROOT: laissez ce manage.py collectstaticchamp vide, lorsque vous le faites , il recherchera tous les fichiers statiques de votre système et les déplacera ici. Votre serveur de fichiers statiques est censé être mappé à ce dossier où qu'il se trouve. Vérifiez-le après avoir exécuté collectstatic et vous trouverez la structure de répertoires que django a construite.

--------Éditer----------------

Comme indiqué par @DarkCygnus, STATIC_ROOT doit pointer vers un répertoire de votre système de fichiers, le dossier doit être vide car il sera rempli par Django.

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

ou

STATIC_ROOT = '/opt/web/project/static_files'

-------- Fin de l'édition -----------------

STATIC_URL: '/ static /' est généralement bien, c'est juste un préfixe pour les fichiers statiques.

Keni
la source
2
Ici, le lien vers la gestion des fichiers statiques dans 1.3 docs.djangoproject.com/en/1.3/howto/static-files
keni
2
STATICFILES_DIRSdevrait servir de répertoires supplémentaires pour les fichiers statiques. Si vous placez tous vos css / js / images dans le dossier APP_NAME / static / APP_NAME, il n'est pas nécessaire de spécifier STATICFILES_DIRS.
laike9m
Merci pour la réponse, à propos du fait de laisser vide STATIC_ROOT, je devais en fait le spécifier settings.py(en faisant STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')) avant d'exécuter la commande collectstatic .
DarkCygnus
Hmm, je peux voir à quel point cela peut être trompeur. Ce que je veux dire en le laissant vide, c'est qu'il commence généralement vide, pas de fichiers. Je mettrai à jour la réponse pour supprimer la confusion.
keni
2

Toutes les réponses ci-dessus sont utiles mais aucune n'a résolu mon problème. Dans mon fichier de production, mon STATIC_URL était https://<URL>/staticet j'ai utilisé le même STATIC_URL dans mon fichier dev settings.py.

Cela provoque un échec silencieux dans django / conf / urls / static.py.

Le test elif not settings.DEBUG or '://' in prefix: détecte le «//» dans l'URL et n'ajoute pas le modèle d'URL statique, ce qui ne permet pas de trouver de fichiers statiques.

Il serait judicieux que Django crache un message d'erreur indiquant que vous ne pouvez pas utiliser http(s)://avecDEBUG = True

J'ai dû changer STATIC_URL pour être '/ static /'

MIkee
la source