Résolue

Django : confusion static / media ?

# Configuration # Django

Gabriel Trouvé

Mentor

Bonsoir,

Il y a une chose sur laquelle je voulais revenir.

STATIC_URL = 'static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'

MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'mediafiles'

Alors les STATIC ça se rapport davantages aux fichiers css et js ?

Et MEDIA les images uploadés par l'utilisateur par exemple ?

Je suis allé sur la doc et j'ai peut être mal compris.

] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Dans l'urlpatterns dans mes projets je rajoute la fonction static et en paramètres je passe MEDIA_URL et MEDIA_ROOT.
Mais dans la doc ils passent les STATIC_URL :
+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

ça serait possible de revenir sur ce point ?

Merci d'avance ^^

Thibault houdon

Mentor

Salut Gab !

C'est effectivement la différence entre les fichiers STATIC et MEDIA dans Django !

  • Les fichiers STATIC sont les fichiers statiques de ton app, comme les fichiers CSS, JS et certaines images qui ne changent pas.

  • Les fichiers MEDIA sont les fichiers téléchargés par les utilisateurs de ton application, comme les images ou les documents. Ça peut être aussi des fichiers que tu télécharges de ton côté.

Pour te donner un exemple sur Docstring, les fichiers statiques sont les fichiers de CSS, de JavaScript et autres ressources qui sont utilisées pour le développement ou le site en général (fichiers de police d'écriture, les images de background que tu peux retrouver sur certaines pages, etc).

Les fichiers médias ça va être par exemple les images d'illustration des articles de blog ou les images des formations.

Concernant static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) et static(settings.STATIC_URL, document_root=settings.STATIC_ROOT), les deux sont utilisés pour servir les fichiers quand tu es en mode développement (debug).

Dans ton urls.py, quand tu utilises static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT), tu indiques à Django de servir les fichiers média (téléchargés par les utilisateurs) pendant le développement.

J'espère que c'est plus clair :)

Merci !
Juste une chose que j'ai mal comprise

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', index, name="index"),
    path('account/', include('accounts.urls')),
    path('verification/', include('verify_email.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

SI j'ai à la fois STATIC et MEDIA je dois faire comme ci-dessus ?
Ajouter deux fois la fonction static pour les medias et les static dans mon url pattern ?
Et en production il faut supprimer ça alors ? Il faut juste :
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', index, name="index"),
    path('account/', include('accounts.urls')),
    path('verification/', include('verify_email.urls')),
] 

?

Merci d'avance ^^

Oui, exactement !

Si tu veux servir à la fois les fichiers STATIC et MEDIA en mode développement (DEBUG), tu dois ajouter deux fois la fonction static(), comme tu l'as écrit dans ton exemple :

urlpatterns = [
    ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Ça permettra de servir les fichiers statiques et les fichiers médias correctement pendant le développement.

En production, Django ne doit pas servir les fichiers statiques, car c'est le rôle de ton serveur web (comme Nginx ou Apache). Donc, en production, tu dois juste avoir :

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', index, name="index"),
    path('account/', include('accounts.urls')),
    path('verification/', include('verify_email.urls')),
]

Pour t'assurer que les fichiers ne soient servis que pendant le développement, tu peux ajouter une condition qui vérifie si le mode DEBUG est activé :

from django.conf import settings

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Avec cette condition, les fichiers STATIC et MEDIA ne seront servis que si le mode DEBUG est activé. Donc, en production, ils ne seront pas servis par Django.

J'espère que ça t'aide ! Si tu as d'autres questions, n'hésite pas à demander 😉

merci PA et Thibault ! tout est parfaitement clair ! la mise

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.