web-dev-qa-db-fra.com

Django - Fichier statique introuvable

J'ai vu plusieurs articles sur ce problème, mais je n'ai pas trouvé ma solution.

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

Voici mes paramètres

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

Mes urls.py

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

Mon / home/glide/Documents/Django/cbox/static / est comme

css
  main.css
javascript
image

J'obtiens une erreur 404 lorsque j'essaie d'accéder à http://127.0.0.1:8000/static/css/main.css.

Dois-je spécifier des modèles pour css, javascript et images individuellement?

58

J'ai confondu STATIC_ROOT et 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 devais mettre mes fichiers communs. Ce répertoire est utilisé pour la production, c'est le répertoire dans lequel les fichiers statiques seront placés (collectés) par collectstatic .

STATICFILES_DIRS est celui dont j'ai besoin.

Comme 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/'),
)

N'oubliez pas non plus de from Django.conf import settings

84

Le service de fichiers statiques peut être réalisé de plusieurs manières; voici mes notes pour moi:

  • ajouter un static/my_app/ répertoire vers my_app (voir la remarque sur l'espace de noms ci-dessous)
  • définir un nouveau répertoire de premier niveau et l'ajouter à 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 façon, et une configuration proche de la façon définie dans la documentation , donc afin de servir le fichier admin-custom.css pour remplacer quelques styles d'administration, j'ai une configuration comme celle-ci:

.
├── 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 ceci:

# /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 sur 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 documents qui ont dissipé toute confusion pour moi:

STATIC_ROOT

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

... ce n'est pas un endroit pour stocker vos fichiers statiques en permanence. Vous devez le faire dans les répertoires qui seront trouvés par les trouveurs de staticfiles, qui par défaut sont des sous-répertoires d'application 'static /' et tous les répertoires que vous incluez dans STATICFILES_DIRS).

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


Espacement des noms de fichiers statiques

Maintenant, nous pourrions peut-être nous en sortir en plaçant 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 qu'il trouve dont le nom correspond, et si vous aviez un fichier statique avec le même nom dans une application différente, Django serait impossible de les distinguer. Nous devons être en mesure de pointer Django vers la droite, et la manière la plus simple de s’assurer de cela est de les nommer. C’est-à-dire de placer ces fichiers statiques dans 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 comportera probablement également des éléments statiques qui ne sont pas liés à une application particulière. En plus d'utiliser un répertoire statique/dans vos applications, vous pouvez définir une liste de répertoires (STATICFILES_DIRS) dans votre fichier de paramètres où Django recherchera également des fichiers statiques.

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

25
ptim

Il ne peut y avoir que deux choses dans settings.py fichier ceux qui servent vos fichiers statiques.

1) STATIC_URL = '/static/'

2)

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)

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

Même alors, si vos fichiers statiques ne se chargent pas, la raison est que vous avez peut-être conservé

DEBUG = False

changez-le en True (strictement pour le développement uniquement). En production, il suffit de changer STATICFILES_DIRS vers le chemin où se trouvent les fichiers statiques.

14
Naren Yellavula

Une autre erreur peut être que votre application ne soit pas répertoriée dans le INSTALLED_APPS liste comme:

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

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

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

Peut être l'une des erreurs et doit être révisée si vous obtenez cette erreur.

2
Aklank Jain

Si votre URL statique est correcte mais quand même:

Pas trouvé: /static/css/main.css

Peut-être votre problème WSGI.

➡ Config WSGI sert à la fois env de développement et env de production

==========================project/project/wsgi.py==========================

import os
from Django.conf import settings
from Django.contrib.staticfiles.handlers import StaticFilesHandler
from Django.core.wsgi import get_wsgi_application

os.environ.setdefault('Django_SETTINGS_MODULE', 'project.settings')
if settings.DEBUG:
    application = StaticFilesHandler(get_wsgi_application())
else:
    application = get_wsgi_application()
1
HoangYell

J'ai constaté que j'ai déplacé mon paramètre DEBUG dans mes paramètres locaux pour qu'il soit remplacé par une valeur par défaut False. Vérifiez essentiellement que le paramètre DEBUG est réellement faux si vous développez avec DEBUG et runserver.

0
Daniel Butler

{'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
Jens Timmerman