170 votes

Différence entre STATIC_URL et STATIC_ROOT sur Django

Je suis déconcerté par static root et souhaite clarifier les choses.

Pour servir des fichiers statiques dans Django, les éléments suivants doivent être présents dans le fichier settings.py y urls.py :

import os
PROJECT_DIR=os.path.dirname(__file__)

1. Chemin absolu vers le répertoire dans lequel les fichiers statiques doivent être collectés

STATIC_ROOT= os.path.join(PROJECT_DIR,'static_media/')

2. Préfixe URL pour les fichiers statiques

STATIC_URL = '/static/'

3. Emplacements supplémentaires pour les fichiers statiques

STATICFILES_DIRS = ( os.path.join(PROJECT_DIR,'static/'),)

...et en urls.py les lignes suivantes :

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += patterns('', (
    r'^static/(?P<path>.*)$',
    'django.views.static.serve',
    {'document_root': settings.STATIC_ROOT}
))

4. Nous utilisons également python manage.py collectstatic

Questions :

  1. Quelqu'un pourrait-il m'expliquer le déroulement des opérations, c'est-à-dire la façon dont les choses devraient idéalement se dérouler. Pour l'instant, je copie/colle les extraits de code ci-dessus dans leurs emplacements désignés et je continue à créer de nouveaux fichiers dans le répertoire statique et cela fonctionne. Dans mon settings.STATIC_ROOT Cependant, j'ai indiqué un autre répertoire.

  2. Il serait bon que quelqu'un explique le déroulement des opérations dans chaque contexte : comment les fichiers sont collectés et gérés, et quelles seraient les bonnes pratiques à suivre.

Merci.

112voto

suhail Points 2520

STATIC_ROOT

Le chemin absolu vers le répertoire où se trouve ./manage.py collectstatic collectera les fichiers statiques pour Exemple : STATIC_ROOT="/var/www/example.com/static/"

maintenant la commande ./manage.py collectstatic copiera tous les fichiers statiques (c'est-à-dire dans le dossier static de vos applications, les fichiers statiques dans tous les chemins) dans le répertoire /var/www/example.com/static/ . il ne vous reste plus qu'à servir ce répertoire sur apache ou nginx..etc.

STATIC_URL

Les URL dont les fichiers statiques dans STATIC_ROOT sont servis par Apache ou nginx. Exemple : /static/ o http://static.example.com/

Si vous définissez STATIC_URL = 'http://static.example.com/' , vous devez servir le STATIC_ROOT (c'est-à-dire "/var/www/example.com/static/" ) par apache ou nginx à l'url 'http://static.example.com/' (pour que vous puissiez vous référer au fichier statique '/var/www/example.com/static/jquery.js' con 'http://static.example.com/jquery.js' )

Maintenant, dans votre django-templates, vous pouvez le référencer par :

{% load static %}
<script src="{% static "jquery.js" %}"></script>

qui rendra :

<script src="http://static.example.com/jquery.js"></script>

43voto

keni Points 518

STATICFILES_DIRS : Vous pouvez conserver ici les fichiers statiques de votre projet, par exemple ceux utilisés par vos modèles.

STATIC_ROOT : laissez ce champ vide, lorsque vous faites manage.py collectstatic Il recherchera tous les fichiers statiques de votre système et les déplacera ici. Votre serveur de fichiers statiques est censé être relié à ce dossier, quel que soit son emplacement. Vérifiez-le après avoir exécuté collectstatic et vous trouverez la structure de répertoire que django a construite.

--------Edit----------------

Comme indiqué par @DarkCygnus, STATIC_ROOT doit pointer sur un répertoire de votre système de fichiers, le dossier doit être vide puisqu'il sera alimenté par Django.

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

ou

STATIC_ROOT = '/opt/web/project/static_files'

--------End Edit -----------------

STATIC_URL Le préfixe '/static/' est généralement correct, il s'agit simplement d'un préfixe pour les fichiers statiques.

10voto

Kai Points 350

Mai 2022 Mise à jour :

Tout d'abord, je donne des explications sur "STATIC_ROOT" puis "STATIC_URL" .

<STATIC_ROOT>

"STATIC_ROOT" ensembles le chemin absolu vers le dossier où sont stockés les fichiers statiques utilisés pour les applications et l'administration dans un projet django et la commande ci-dessous crée le dossier et rassemble les fichiers statiques des applications et de l'administration dans un projet django dans le dossier (* La définition de "STATIC_ROOT" n'influence jamais l'URL d'un fichier statique. ):

python manage.py collectstatic 

Et "STATIC_ROOT" ne fonctionne qu'en Mode de production qui est "DEBUG = False" comme indiqué ci-dessous :

# "core/settings.py"

DEBUG = False // Production Mode

Maintenant, nous avons un projet django avec les fichiers statiques "core.js" dans le dossier "core" où "settings.py" est et "myapp.css" dans le dossier "myapp". qui est "une application" comme indiqué ci-dessous :

enter image description here

Et les dossiers "css", "fonts", "img" et "js" dans le dossier "admin" dans le dossier "venv". comme indiqué ci-dessous. *J'utilise Environnement virtuel nommé "venv" pour ce projet django donc les fichiers statiques pour "admin" est en elle et le chemin relatif vers le dossier "admin es "venv/lib/python3.8/site-packages/django/contrib/admin/static/admin" :

enter image description here

Ensuite, nous fixons "os.path.join(BASE_DIR, 'static')" qui est " C:\Users\kai\django -Projet \static "dans Windows dans mon cas a "STATIC_ROOT" . En outre, nous fixons "Faux" a "DEBUG parce que "STATIC_ROOT" ne fonctionne qu'en Mode de production comme je l'ai déjà dit :

# "core/settings.py"

DEBUG = False // Production Mode

STATIC_ROOT = os.path.join(BASE_DIR, 'static') // Here
STATIC_URL = '/static/'

Maintenant, nous exécutons la commande ci-dessous :

python manage.py collectstatic 

Ensuite, "dossier "statique est créé et "dossiers "css", "fonts", "img" et "js" dans le dossier "admin y "myapp.css" dans le dossier "myapp". sont rassemblés dans "dossier "statique comme indiqué ci-dessous, mais comme nous pouvons le voir, "core.js" dans le dossier "core n'est pas collectée dans les "dossier "statique comme indiqué ci-dessous, car comme je l'ai déjà dit, la commande "python manage.py collectstatic". collecte les fichiers statiques des applications et de l'administration dans un projet django mais le dossier "core" qui contient "settings.py" n'est pas une application ni un administrateur. C'est pourquoi "core.js" dans le dossier "core n'est pas collectée dans les "dossier "statique :

enter image description here

Mais il existe un moyen de collecter "core.js" dans le dossier "core en "dossier "statique . Pour ce faire, nous devons utiliser "STATICFILES_DIRS" puis définir os.path.join(BASE_DIR, 'core/static')" qui est " C:\Users\kai\django -Projet \core\static "dans Windows dans mon cas a "STATICFILES_DIRS" comme indiqué ci-dessous :

# "core/settings.py"

DEBUG = False

STATICFILES_DIRS = [ // Here
    os.path.join(BASE_DIR, 'core/static')
]

STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'

Maintenant, nous exécutons à nouveau la commande ci-dessous :

python manage.py collectstatic 

Ensuite, saisissez "oui" puis appuyez sur "Entrer" pour écraser dossier "statique" existant :

Vous avez demandé à collecter des fichiers statiques à l'emplacement de destination tel que spécifié dans vos paramètres :

C:\Users\kai\django -Projet \static

Cela écrasera les fichiers existants ! Êtes-vous sûr de vouloir faire cela ?

Tapez "oui" pour continuer ou "non" pour annuler : oui

Aujourd'hui, "core.js" dans le dossier "core est collectée en "dossier "statique comme indiqué ci-dessous :

enter image description here

<STATIC_URL>

Ensuite, j'explique ce qu'est un "STATIC_URL" .

"STATIC_URL" ensembles la partie du répertoire avant de l'URL du fichier statique entre la partie hôte et la partie fichier de l'URL du fichier statique comme indiqué ci-dessous (* Le réglage de "STATIC_URL" n'influence jamais le chemin absolu du dossier où sont stockés les fichiers statiques utilisés pour les applications et l'administration dans un projet django. ):

       |     Host      |   Directory    |  File  |
       |               |Front |  Back   |        |
        <-------------> <----> <-------> <------>      
https://www.example.com/static/admin/css/base.css

Par exemple, nous définissons '/static/' a "STATIC_URL" comme indiqué ci-dessous (* "STATIC_URL" fonctionne dans les deux Mode de développement qui est "DEBUG = True" y Mode de production qui est "DEBUG = False" ):

# "core/settings.py"

DEBUG = False

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

STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/' # Here

Ensuite, ouvrez Administrateur Django :

enter image description here

Appuyez ensuite sur "F12" pour ouvrir "Outils du développeur" pour vérifier les ressources utilisées pour la page d'administration de Django actuellement ouverte dans "Sources". et il y a les fichiers statiques de "admin" que nous venons de rassembler dans le dossier "static". :

enter image description here

Ensuite, survolez "base.css" en "css" pour vérifier l'URL :

enter image description here

Comme nous le voyons, nous pourrions définir la partie "statique" du répertoire avant :

                       Here  
                     <------>
http://localhost:8000/static/admin/css/base.css

L'URL ci-dessous correspond au cas suivant "www.example.com" con "https" :

                         Here
               <------>
https://www.example.com/static/admin/css/base.css

Et nous pouvons changer la partie "statique" du répertoire avant a "hello/world" .

Il suffit donc de modifier "STATIC_URL" de '/static/' a '/hello/world/' comme indiqué ci-dessous :

# "core/settings.py"

DEBUG = False

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

STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/hello/world/' # Here

Ensuite, rafraîchissez la page d'administration de Django :

enter image description here

Ensuite, la partie "statique" du répertoire avant est remplacé par "hello/world" comme indiqué ci-dessous :

                         Here  
                     <----------->
http://localhost:8000/hello/world/admin/css/base.css

2voto

MIkee Points 11

Toutes les réponses ci-dessus sont utiles, mais aucune n'a résolu mon problème. Dans mon fichier de production, mon STATIC_URL était le suivant https://<URL>/static et j'ai utilisé le même STATIC_URL dans mon fichier dev settings.py.

Cela provoque un échec silencieux dans django/conf/urls/static.py.

Le test elif not settings.DEBUG or '://' in prefix: détecte le "//" dans l'URL et n'ajoute pas le modèle d'URL statique, ce qui fait qu'aucun fichier statique n'est trouvé.

Il serait intéressant que Django affiche un message d'erreur indiquant qu'il est impossible d'utiliser un élément de type http(s):// con DEBUG = True

J'ai dû modifier STATIC_URL pour qu'il soit '/static/'

0voto

rs_punia Points 35

Après Django 3.1+ Il y a un léger changement dans la configuration des chemins d'accès aux répertoires, mais les concepts sont les mêmes, bien sûr.

FICHIERS_STATIQUES

STATICFILES_DIRS = [
    BASE_DIR / 'static',
    BASE_DIR / 'app_1/static',
    BASE_DIR / 'app_2/static',
]

Comme son nom l'indique, il s'agit d'une liste de répertoires. Elle est utilisée pour spécifier plusieurs répertoires pour les fichiers statiques. Très utile pour la réutilisation d'une application. Au lieu d'avoir un seul répertoire pour tous les fichiers statiques, chaque application a son propre répertoire. Tout comme les modèles pour chaque application individuelle.

Pour configurer le répertoire des fichiers statiques d'une application :

=> my_app
    => static
        => my_app
            => css
            => js

En mode développement, avec la commande python manage.py runserver Django recherche les fichiers statiques à l'aide de l'option STATICFILES_FINDERS de la mise en place. Par défaut, il tente de trouver le fichier statique demandé dans les dossiers répertoriés dans le paramètre STATICFILES_DIRS. En cas d'échec, Django tente de trouver le fichier à l'aide du paramètre django.contrib.staticfiles.finders.AppDirectoriesFinder qui recherche dans le dossier statique de chaque application installée dans le projet.

STATIC_ROOT

STATIC_ROOT = BASE_DIR / 'static'

Il s'agit du chemin absolu vers le répertoire où se trouve python manage.py collectstatic collectera les fichiers statiques pour le déploiement. Exemple :

/var/www/example.com/static/"

Pour le développement, il n'est pas nécessaire de configurer STATIC_ROOT mais extrêmement important pour la production. Il s'agit du chemin à prendre en compte par les serveurs Nginx et Apache pour accéder aux fichiers statiques du site web.

STATIC_URL

URL à utiliser pour faire référence aux fichiers statiques situés dans STATIC_ROOT. Exemple : "static/" ou "http://static.example.com/"

STATIC_URL = '/static/'

Supposons maintenant que je décide de configurer le STATIC_URL='/asset/' Je dois donc modifier STATIC_ROOT=BASE_DIR / 'asset' et le nom de mon répertoire devrait également être asset .

Référence :

https://docs.djangoproject.com/en/4.0/ref/contrib/staticfiles/

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