web-dev-qa-db-fra.com

Django staticfiles

J'ai un petit problème avec Django's application staticfiles .

J'ai ajouté

'Django.contrib.staticfiles',

à mes INSTALLED_APPS et ont ajouté

STATIC_URL = '/static/'
STATIC_ROOT = '/Users/kevdotbadger/Django/mylook/static/'

à mon settings.py fichier.

Tous mes fichiers statiques se trouvent dans le STATIC_ROOT dossier sur mon Mac.

Maintenant, dans mon modèle, j'utilise

{{ STATIC_URL }}

qui rend correctement à /static/.

Pourtant

{{ STATIC_URL }}css/style.css

entraîner une erreur 404. J'utilise la commande "runserver" comme serveur.

Y a-t-il quelque chose qui me manque?

41
dotty

Je vous implore de lire les documents pratiques ici: http://docs.djangoproject.com/en/dev/howto/static-files/

En bref: STATIC_ROOT n'est utilisé que si vous appelez la commande collectstatic manangement. Il n'est pas nécessaire d'ajouter le répertoire au paramètre STATICFILES_DIRS pour servir vos fichiers statiques!

Pendant le développement (lorsque la vue de diffusion automatique est utilisée), les fichiers statiques rechercheront automatiquement les fichiers statiques à divers emplacements (car vous appelez sa vue de diffusion avec un chemin d'accès à un fichier statique). Pour cette recherche, il utilisera les dénommés "finders" (tels que définis dans le paramètre STATICFILES_FINDERS).

  1. L'un des moteurs de recherche par défaut est AppDirectoriesFinder, qui recherchera dans le répertoire "/ static /" de chacune des applications de votre paramètre INSTALLED_APPS.

  2. Un autre Finder par défaut est FileSystemFinder, qui recherchera dans les répertoires que vous spécifiez dans le paramètre STATICFILES_DIRS.

BTW, ces deux modèles de recherche sont similaires au fonctionnement du chargement de modèle.

La même technique sera utilisée lors de l'exécution de la commande collectstatic, sauf qu'elle va maintenant collecter les fichiers des différents emplacements (en utilisant les mêmes viseurs que ci-dessus), en plaçant les fichiers trouvés dans STATIC_ROOT, prêts pour le déploiement.

118
jezdez

J'ai trouvé une solution rapide et facile pour servir les fichiers statiques globaux du projet pendant le développement:

  • Démarrez une nouvelle application qui contient les fichiers statiques de vos projets (par exemple, "manage.py startapp static_content")
  • Créez un dossier nommé "statique" dans cette application et placez-y vos fichiers statiques.
  • Ajoutez votre nouvelle application à la liste des applications installées
3
Markus Lenger

Si vous voulez juste une solution - faites défiler jusqu'à la "Solution".

Aperçu

Je découvrais le même problème hier. Voici ce que j'ai trouvé:

Tout ce dont vous avez besoin est un Finder statique approprié, qui trouvera votre STATIC_ROOT et tout son contenu, mais il n'y a pas un tel Finder. Voici les moteurs de recherche par défaut:

  • Django.contrib.staticfiles.finders.AppDirectoriesFinder - recherche installée Django applications dir pour le dossier 'statique', mais la plupart d'entre eux utilisent pour l'instant des dossiers "médias" obsolètes.

  • Django.contrib.staticfiles.finders.FileSystemFinder - utilisez tous les répertoires mentionnés dans STATICFILES_DIRS, mais vous ne pouvez pas y ajouter STATIC_ROOT.

  • Django.contrib.staticfiles.finders.DefaultStorageFinder - recherchez statique dans votre DEFAULT_FILE_STORAGE qui est Django.core.files. storage.FileSystemStorage par défaut et il pointe vers votre MEDIA_ROOT

Solution

C'est tout, pas de choix supplémentaires. Il n'y a pas de choix pour utiliser STATIC_ROOT pour l'instant (dans Django 1.3).
Je viens donc d'écrire mon propre Finder personnalisé pour ces besoins:

  • Mon fichier de recherche statique personnalisé: finders.py:

    from Django.core.files.storage import FileSystemStorage
    from Django.contrib.staticfiles.finders import BaseStorageFinder
    from Django.conf import settings
    
    class StaticFinder(BaseStorageFinder):
        storage = FileSystemStorage(settings.STATIC_ROOT, settings.STATIC_URL)
    
  • settings.py:

    STATICFILES_FINDERS = (
        'finders.StaticFinder',
    )
    
  • Si vous voulez l'utiliser avec un autre finder - je vous suggère de le mettre dans STATICFILES_FINDERS

Et rappelez-vous: cette solution ne doit être utilisée que dans les besoins de développement et jamais en production!

3
Rost
STATIC_ROOT = '/home/ws/be/bla/'
STATICFILES_DIRS = ('/home/ws/be/static/',)
STATIC_URL = '/static/'

Cela fonctionne pour moi. STATIC_ROOT doit être différent de STATICFILES_DIRS (Django version 1.4 pre-alpha SVN-16436)

1
maruusos82

Tout d'abord, assurez-vous que service statique est activé dans votre urls.py POUR LE DÉVELOPPEMENT UNIQUEMENT.

En outre, vous pouvez avoir une barre oblique supplémentaire là-dedans. Si votre STATIC_URL == '/ statique /', alors

{{STATIC_URL}}/css/style.css doit être {{STATIC_URL}} css/style.css.

1
C. Alan Zoppa