116 votes

Django - Fichier statique non trouvé

J'ai vu plusieurs posts sur ce sujet mais je 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/',
)
...

Mon 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/ se présente comme suit

css
  main.css
javascript
image

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

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

147voto

Pierre de LESPINAY Points 7698

Je suis confus STATIC_ROOT y FICHIERS_STATIQUES

En fait, je ne comprenais pas vraiment l'utilité de STATIC_ROOT . Je pensais qu'il s'agissait du répertoire dans lequel je devais placer 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 .

FICHIERS_STATIQUES est celui dont j'ai besoin.

Étant donné que je travaille 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 FICHIERS_STATIQUES :

#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 from django.conf import settings

55voto

Naren Yellavula Points 2806

Il ne peut y avoir que deux choses dans settings.py ce qui vous pose des problèmes.

1) STATIC_URL = '/static/'

2)

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

et vos fichiers statiques doivent se trouver dans le répertoire static qui se trouve dans le même répertoire que le fichier de configuration du projet.

Même dans ce cas, si vos fichiers statiques ne se chargent pas, c'est que vous avez peut-être conservé

DEBUG = False

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

43voto

memeLab Points 1486

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

  • ajouter un static/my_app/ dans le répertoire my_app (voir la note sur l'espacement des 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 méthode, et une configuration proche de la méthode défini dans la documentation Ainsi, pour 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/'

Il est ensuite utilisé dans le modèle de la manière suivante :

# /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 [ndlr : installé par défaut], cela sera fait automatiquement par runserver lorsque DEBUG est à True [...]

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

Lors du déploiement, je lance collectstatic et servir les fichiers statiques avec nginx.


Les documents qui m'ont permis d'éclaircir toute la confusion :

STATIC_ROOT

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

...c'est pas un endroit où stocker vos fichiers statiques de façon permanente. Vous devez le faire dans des répertoires qui seront trouvés par les outils de recherche de staticfiles, qui par défaut sont les 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


Espacement des noms de fichiers statiques

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 dont le nom correspond, et si vous aviez un fichier statique portant le même nom dans une autre application, Django serait incapable de les distinguer. Nous devons être capables d'indiquer à Django le bon fichier, et la manière la plus simple de s'en assurer est de les nommer. C'est-à-dire en plaçant 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/


FICHIERS_STATIQUES

Votre projet comportera probablement aussi des éléments statiques qui ne sont pas liés à une application particulière. En plus d'utiliser un répertoire static/ dans vos applications, vous pouvez définir une liste de répertoires (STATICFILES_DIRS) dans votre fichier de configuration où Django cherchera également des fichiers statiques.

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

13voto

HoangYell Points 339

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

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

Il s'agit peut-être de votre problème WSGI.

➡ Config WSGI sert à la fois l'environnement de développement et l'environnement 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()

8voto

yuv Points 360
  1. Vous pouvez retirer le STATIC_ROOT ligne
  2. Ou vous pouvez créer un autre static dans un autre répertoire. Supposons que le répertoire soit : project\static Mise à jour :

    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'project/static/')
    ]
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')

Quoi que vous fassiez, l'essentiel est STATICFILES_DIRS y STATIC_ROOT ne doivent pas contenir le même répertoire.

Je sais que cela fait longtemps, mais j'espère que les nouveaux copains pourront y trouver de l'aide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X