web-dev-qa-db-fra.com

django statique adresse statique statique racine

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__)

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

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

2. Préfixe de l'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:

  1. 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. 

  2. 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. 

100
user993563

STATIC_ROOT

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. 

STATIC_URL

La URL dont les fichiers statiques du répertoire STATIC_ROOT sont servis (par Apache ou nginx..etc) . Exemple: /static/ ou http://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>
66
simple_human

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.

25
keni

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 /'

0
MIkee