Django - fichier statique introuvable

j'ai vu plusieurs billets pour ce numéro mais n'ai pas trouvé ma solution.

j'essaie de servir des fichiers statiques dans mon environnement de développement Django 1.3.

Voici mes paramètres

...
STATIC_ROOT = '/home/glide/Documents/django/cbox/static/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
  '/static/',
)
...

My urls.py

urlpatterns = patterns('',
...
  url(r'^static/(?P<path>.*)$', 'django.views.static.serve',
    {'document_root', settings.STATIC_ROOT}
  ),
...
);

Mon /home/glisse/Documents/django/cbox/static/ répertoire est comme

css
  main.css
javascript
image

j'obtiens une erreur 404 en essayant de accès http://127.0.0.1:8000/static/css/main.css .

dois-je spécifier les motifs pour css, javascript et les images individuellement ?

44
demandé sur Pierre de LESPINAY 2011-05-16 12:14:19

5 réponses

I confused STATIC_ROOT and STATICFILES_DIRS

en fait, je ne comprenais pas vraiment l'utilité de STATIC_ROOT . Je pensais que c'était le répertoire sur lequel je dois mettre mes fichiers communs. Ce répertoire est utilisé pour la production, c'est le répertoire sur lequel les fichiers statiques seront mis (collectés) par collectstatic .

STATICFILES_DIRS est celui dont j'ai besoin.

puisque je suis dans un environnement de développement, la solution pour moi est de ne pas utiliser STATIC_ROOT (ou de spécifier un autre chemin) et de définir mon répertoire de fichiers communs dans STATICFILES_DIRS :

#STATIC_ROOT = (os.path.join(SITE_ROOT, 'static_files/'))
import os
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
STATICFILES_DIRS = (
  os.path.join(SITE_ROOT, 'static/'),
)

aussi n'oubliez pas de from django.conf import settings

70
répondu Pierre de LESPINAY 2014-12-05 07:59:29

servir des fichiers statiques peut être réalisé de plusieurs façons; voici mes notes à moi-même:

  • ajouter un static/my_app/ répertoire à my_app (voir la note sur l'espace de noms ci-dessous)
  • définissez un nouveau répertoire de haut niveau et ajoutez-le à STATICFILES_DIRS dans settings.py (notez que The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting )

je préfère la première voie, et une configuration qui est proche de la voie défini dans le documentation , donc pour servir le fichier admin-custom.css pour outrepasser un couple de styles d'administration, j'ai une configuration comme ceci:

.
├── my_app/
│   ├── static/
│   │   └── my_app/
│   │       └── admin-custom.css
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── static/
├── templates/
│   └── admin/
│       └── base.html
└── manage.py
# settings.py
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'

ceci est ensuite utilisé dans le modèle comme ainsi:

# /templates/admin/base.html
{% extends "admin/base.html" %}
{% load static %}

{% block extrahead %}
    <link rel="stylesheet" href="{% static "my_app/admin-custom.css" %}">
{% endblock %}

pendant le développement, si vous utilisez django.contrib.staticfiles [ed: installé par défaut], cela sera fait automatiquement par runserver lorsque DEBUG est défini à True [...]

https://docs.djangoproject.com/en/1.10/howto/static-files /

lors du déploiement, j'exécute collectstatic et je sers des fichiers statiques avec nginx.


Les docs qui a dissipé la confusion pour moi:

STATIC_ROOT

le chemin absolu vers le répertoire où collectstatic recueillera les fichiers statiques pour le déploiement.

...c'est pas un endroit pour stocker vos fichiers statiques de façon permanente. Vous devez faire cela dans les répertoires qui seront trouvés par les finders de staticfiles, qui par défaut sont des sous-répertoires 'static/' app et tous les répertoires que vous incluez dans STATICFILES_DIRS).

https://docs.djangoproject.com/en/1.10/ref/settings/#static-root


nom de fichier statique

maintenant nous pourrions être en mesure de nous en sortir en mettant nos fichiers statiques directement dans my_app/static/ (plutôt que de créer un autre sous-répertoire my_app), mais ce serait en fait une mauvaise idée. Django utilisera le premier fichier statique il trouve dont le nom correspond, et si vous aviez un fichier statique avec le même nom dans une autre application, Django serait incapable de les distinguer. On doit pouvoir pointer Django à la bonne, et la façon la plus facile d'assurer cela est de les nommer. C'est, en plaçant ces fichiers statiques à l'intérieur d'un autre répertoire nommé pour l'application elle-même.

https://docs.djangoproject.com/en/1.10/howto/static-files /


STATICFILES_DIRS

votre projet aura probablement aussi des actifs statiques qui ne sont pas liés à une application en particulier. En plus de l'utilisation d'un répertoire/ statique à l'intérieur de vos applications, vous pouvez définir une liste de répertoires (STATICFILES_DIRS) dans votre fichier de paramètres où Django cherchera également des fichiers statiques.

https://docs.djangoproject.com/en/1.10/howto/static-files /

17
répondu ptim 2016-07-16 07:41:25

il ne pouvait y avoir que deux choses settings.py fichier qui rend vos fichiers statiques servir.

1) STATIC_URL = '/ static / '

2) STATICFILES_DIRS = ( OS.chemin.join(BASE_DIR, " static"), )

et vos fichiers statiques doivent se trouver dans le répertoire static qui est dans le même répertoire que le fichier de paramètres du projet.

même si vos fichiers statiques ne sont pas chargés alors la raison est , vous pourriez avoir gardé

DEBUG = False

le changer en vrai (strictement pour le développement seulement). En production, il suffit de changer STATICFILES_DIRS à n'importe quel chemin où les fichiers statiques se trouvent.

7
répondu Naren Yellavula 2015-06-15 07:21:08

une autre erreur peut être de ne pas avoir votre application listée dans le INSTALLED_APPS listing like:

INSTALLED_APPS = [
    # ...
    'your_app',
]

sans l'avoir dans, vous pouvez faire face à des problèmes comme ne pas détecter vos fichiers statiques, essentiellement tous les fichiers impliquant votre application. Même si elle peut être correcte comme suggéré dans la réponse correcte en utilisant:

STATICFILES_DIRS = (adding/path/of/your/app)

peut être l'une des erreurs et doit être revu si obtenir cette erreur.

1
répondu Aklank Jain 2017-02-01 07:21:33

{'document_root', settings.STATIC_ROOT} doit être {'document_root': settings.STATIC_ROOT}

ou vous obtiendrez une erreur comme dictionary update sequence element #0 has length 6; 2 is required

0
répondu Jens Timmerman 2016-04-07 13:17:06