Résolue

Retour sur les médias et fichiers statiques en mode développment

# Configuration # Django

Gabriel Trouvé

Mentor

Bonjour,

Je reviens sur un concept ! :)

Ce que je fais habituellement.

il faut bien gérer les statiques ET médias en mode dev

urlpatterns = [
    path('admin/', admin.site.urls),
]


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

Mais j'ai trouvé quelque chose d'intéressant dans le code de Wagtail (qui fait référence au code de Django) qui me dit qu'on pourrtait faire autrement :

urlpatterns = [
    path('admin/', admin.site.urls),
]


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

La fonction dans le détail:

urlpatterns = []


def staticfiles_urlpatterns(prefix=None):
    """
    Helper function to return a URL pattern for serving static files.
    """
    if prefix is None:
        prefix = settings.STATIC_URL
    return static(prefix, view=serve)
    # Pour moi ça revient au même que faire static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) tant qu'on ne passe rien à prefix


# Only append if urlpatterns are empty -- Je ne comprends pas pourquoi ils mettent ça... ?
if settings.DEBUG and not urlpatterns:
    urlpatterns += staticfiles_urlpatterns()

Si je vais regarder dans serve:

def serve(request, path, insecure=False, **kwargs):
    """
    Serve static files below a given point in the directory structure or
    from locations inferred from the staticfiles finders.

    To use, put a URL pattern such as::

        from django.contrib.staticfiles import views

        path('<path:path>', views.serve)

    in your URLconf.

    It uses the django.views.static.serve() view to serve the found files.
    """
    if not settings.DEBUG and not insecure:
        raise Http404
    normalized_path = posixpath.normpath(path).lstrip("/")
    absolute_path = finders.find(normalized_path)
    if not absolute_path:
        if path.endswith("/") or path == "":
            raise Http404("Directory indexes are not allowed here.")
        raise Http404("'%s' could not be found" % path)
    document_root, path = os.path.split(absolute_path)
    return static.serve(request, path, document_root=document_root, **kwargs)

Donc en pratique on peut utiliser les deux manières ! A moins d'avoir loupé quelque chose...

Merci d'avance !

Salut Gab !

Je ne m'en ferais pas trop par rapport à la façon qu'a Wagtail de gérer ça, perso je te conseille de suivre la façon indiquée dans la documentation, et après dans la pratique chaque projet est différent, il y a plein de façons en production par la suite de servir les fichiers statiques et media (sur ton serveur, sur un CDN, avec whitenoise, etc etc).

De ce que je vois effectivement du code que tu as mis je ne vois pas trop de différence avec ce que fait Django 🤔

Gabriel Trouvé

Mentor

Oui ok je vais faire comme d'hab c'est juste que ça m'a interpellé.

Mais oui je pense que la finalité est la même je ne vois pas de différence vu ce que fait staticfiles_urlpatterns()

merci ! :)

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.