web-dev-qa-db-fra.com

Différences entre STATICFILES_DIR, STATIC_ROOT et MEDIA_ROOT

Quelles sont les différences de ces trois URL statiques?

Je ne sais pas si j'ai raison, j'utilise le MEDIA_ROOT Pour stocker mes photos téléchargées (via models.ImageField())

Cependant, j'ai créé un script JS pour mon administrateur et dans admin.py. J'ai défini les médias comme ci-dessous:

....
class Media:
      js = ('/admin/custom.js', )

et mon settings.py:

 ....
 STATIC_ROOT = "/home/user/project/Django1/top/listing/static"

et j'ai ajouté le custom.js à STATIC_ROOT/admin/custom.js, mais cela ne fonctionne pas. Erreur 404 introuvable.

Et puis je change le STATIC_ROOT En STATICFILES_DIRS, Et ça marche !!

....
STATICFILES_DIRS = "/home/user/project/Django1/top/listing/static"

Donc, je ne comprends pas ce qui se passe ici. En fait, je ne comprends tout simplement pas quelle est la différence entre STATIC_ROOT Et STATICFILES_DIRS.

Actuellement, je teste Django sur ma machine via virtualenv, pas encore déployé, est-ce la raison pour laquelle STATIC_ROOT Ne fonctionne pas ??

50
dev-jim

Vous pouvez trouver ces paramètres dans la documentation Django . Voici mes propres définitions et citations de la documentation:

  • MEDIA_ROOT est le dossier où les fichiers téléchargés à l'aide de FileField iront.

    Chemin absolu du système de fichiers vers le répertoire qui contiendra fichiers téléchargés par l'utilisateur .

  • STATIC_ROOT est le dossier où les fichiers statiques seront stockés après avoir utilisé manage.py collectstatic

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

    Si l'application staticfiles contrib est activée (par défaut), la commande de gestion collectstatic collectera les fichiers statiques dans ce répertoire. Voir le guide sur la gestion des fichiers statiques pour plus de détails sur l'utilisation.

  • STATICFILES_DIRS est la liste des dossiers où Django recherchera des fichiers statiques supplémentaires en dehors du dossier static de chaque application installée.

    Ce paramètre définit les emplacements supplémentaires que l'application staticfiles traversera si le Finder FileSystemFinder est activé, par exemple si vous utilisez la commande de gestion collectstatic ou findstatic ou utilisez la vue de service de fichiers statiques.

Dans vos paramètres, vous devriez avoir:

MEDIA_ROOT = os.path.join(BASE_DIR, "media/")
STATIC_ROOT = os.path.join(BASE_DIR, "static/")

# Make a Tuple of strings instead of a string
STATICFILES_DIRS = ("/home/user/project/Django1/top/listing/static", )

...où:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

comme défini dans la valeur par défaut Django settings.py à présent.

77
Maxime Lorant

Développement

STATIC_ROOT est inutile pendant le développement, il n'est nécessaire que pour le déploiement.

Pendant le développement, STATIC_ROOT ne fait rien. Vous n'avez même pas besoin de le régler. Django recherche les fichiers statiques dans le répertoire de chaque application (myProject/appName/static) et les sert automatiquement.

C'est la magie opérée par manage.py runserver quand DEBUG=True.

Déploiement

Lorsque votre projet est mis en ligne, les choses diffèrent. Vous utiliserez très probablement du contenu dynamique en utilisant Django et les fichiers statiques seront servis par Nginx. Pourquoi? Parce que Nginx est incroyablement efficace et réduira la charge de travail de Django.

C'est ici que STATIC_ROOT devient pratique, car Nginx ne sait rien de votre projet Django et ne sait pas où trouver les fichiers statiques.

Vous définissez donc STATIC_ROOT = '/some/folder/' et dire à Nginx de rechercher des fichiers statiques dans /some/folder/. Ensuite, vous exécutez manage.py collectstatic et Django copiera les fichiers statiques de toutes les applications que vous devez /some/folder/.

Répertoires supplémentaires pour les fichiers statiques

STATICFILES_DIRS est utilisé pour inclure les répertoires supplémentaires que collectstatic doit rechercher. Par exemple, par défaut, Django ne reconnaît pas /myProject/static/. Vous pouvez donc l'inclure vous-même.

Exemple

STATIC_URL = '/static/'

if not DEBUG: 
    STATIC_ROOT = '/home/Django/www-data/site.com/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static/'),
]
72
Max Malysh

Différence entre STATICFILES_DIRS et STATIC_ROOT

Le STATICFILES_DIRS peut contenir d'autres répertoires (pas nécessairement des répertoires d'application) avec des fichiers statiques et ces fichiers statiques seront collectés dans votre STATIC_ROOT lorsque vous exécutez collectstatic. Ces fichiers statiques seront alors servis par votre serveur web et ils seront servis depuis votre STATIC_ROOT.

Si vous avez actuellement des fichiers dans votre STATIC_ROOT que vous souhaitez servir, vous devez les déplacer vers un autre répertoire et placer cet autre répertoire dans STATICFILES_DIRS. Votre STATIC_ROOT le répertoire doit être vide et tous les fichiers statiques doivent être collectés dans ce répertoire.

MEDIA_ROOT où les fichiers multimédias, tous les fichiers téléchargés vont. Exemple: images, fichiers

19
Prashant Gaur