Je suis confus 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__)
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.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}
))
4. Nous utilisons également python manage.py collectstatic
Des questions:
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.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.
la source
if settings.DEBUG:
django n'est pas très bon pour servir des médias statiques, cela devrait être laissé à un vrai serveur Web.Réponses:
STATIC_ROOT
maintenant, la commande
./manage.py collectstatic
copiera 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
Si vous définissez
STATIC_URL = 'http://static.example.com/'
, vous devez servir leSTATIC_ROOT
dossier (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:
qui rendra:
la source
{{ STATIC_URL }}jquery.js
et{% 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}}
static
méthode au lieu deSTATIC_URL
méthode, et le bogue a disparu. Bon appel sur les suggestions basées sur les versions.STATICFILES_DIRS
: Vous pouvez conserver ici les fichiers statiques de votre projet, par exemple ceux utilisés par vos modèles.STATIC_ROOT
: laissez cemanage.py collectstatic
champ 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.
ou
-------- Fin de l'édition -----------------
STATIC_URL
: '/ static /' est généralement bien, c'est juste un préfixe pour les fichiers statiques.la source
STATICFILES_DIRS
devrait 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écifierSTATICFILES_DIRS
.settings.py
(en faisantSTATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
) avant d'exécuter la commande collectstatic .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 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 /'
la source