Je suis confus par static root
et je veux clarifier les choses.
Pour servir des fichiers statiques dans Django, les éléments suivants doivent être dans settings.py
et urls.py
:
import os
PROJECT_DIR=os.path.dirname(__file__)
STATIC_ROOT= os.path.join(PROJECT_DIR,'static_media/')
STATIC_URL = '/static/'
STATICFILES_DIRS = ( os.path.join(PROJECT_DIR,'static/'),)
... et dans urls.py
les 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}
))
python manage.py collectstatic
Des questions:
Quelqu'un pourrait-il m'expliquer le déroulement du travail: comment devrait-on idéalement procéder? A 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.
Ce serait formidable si quelqu'un pouvait expliquer le flux de travail de chaque paramètre: comment les fichiers sont-ils collectés et gérés, et quelle serait la bonne pratique à suivre.
Merci.
Le chemin absolu du répertoire où
./manage.py collectstatic
collectera les fichiers statiques à déployer . Exemple:STATIC_ROOT="/var/www/example.com/static/"
désormais, la commande ./manage.py collectstatic
copiera tous les fichiers statiques (c.-à-d. dans le dossier statique de vos applications et dans tous les chemins d'accès) dans le répertoire /var/www/example.com/static/
. maintenant, vous devez seulement servir ce répertoire sur Apache ou nginx..etc.
La
URL
dont les fichiers statiques du répertoireSTATIC_ROOT
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 alors servir le dossier STATIC_ROOT
(c.-à-d. "/var/www/example.com/static/"
) d'Apache ou nginx à l'adresse 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 modèles Django, 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>
STATICFILES_DIRS
: Vous pouvez conserver les fichiers statiques de votre projet ici, par exemple. ceux utilisés par vos modèles.
STATIC_ROOT
: laissez ce champ vide, quand vous ferez manage.py collectstatic
, il recherchera tous les fichiers statiques de votre système et les déplacera ici. Votre serveur de fichiers statiques est censé être mappé sur ce dossier, où qu'il se trouve. Vérifiez-le après avoir exécuté collectstatic et vous trouverez la structure de répertoires construite par Django.
--------Modifier----------------
Comme l'a souligné @DarkCygnus, STATIC_ROOT doit pointer sur 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 Edit -----------------
STATIC_URL
: '/ static /' est généralement correct, c'est juste un préfixe pour les fichiers statiques.
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>/static
et j'ai utilisé le même STATIC_URL dans mon fichier dev settings.py.
Cela provoque une défaillance silencieuse dans Django/conf/urls/static.py.
Le test Elif not settings.DEBUG or '://' in prefix:
Prend le '//' dans l'URL et n'ajoute pas le modèle d'URL statique, ce qui ne permet pas de trouver des fichiers statiques.
Il serait judicieux que Django crache un message d'erreur indiquant que vous ne pouvez pas utiliser http(s)://
avec DEBUG = True
Je devais changer STATIC_URL pour être '/ static /'