web-dev-qa-db-fra.com

Django MEDIA_URL et MEDIA_ROOT

J'essaie de télécharger une image via l'administrateur Django, puis de la visualiser dans une page de l'interface ou simplement via une URL.

Notez tout cela sur mon ordinateur local.

Mes paramètres sont les suivants:

MEDIA_ROOT = '/home/dan/mysite/media/'

MEDIA_URL = '/media/'

J'ai défini le paramètre upload_to sur 'images' et le fichier a été correctement chargé dans le répertoire:

'/home/dan/mysite/media/images/myimage.png'

Cependant, lorsque j'essaie d'accéder à l'image à l'URL suivante:

http://127.0.0.1:8000/media/images/myimage.png

Je reçois une erreur 404.

Dois-je configurer des patrons URLconf spécifiques pour les médias téléchargés?

Tout conseil apprécié.

Merci.

189
Dan

UPDATE pour Django> = 1.7

Documentation de Django 2.1: Servir des fichiers téléchargés par un utilisateur au cours du développement

from Django.conf import settings
from Django.conf.urls.static import static

urlpatterns = patterns('',
    # ... the rest of your URLconf goes here ...
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Vous n'avez plus besoin de if settings.DEBUG car Django s'en chargera en veillant à ce qu'il ne soit utilisé qu'en mode débogage.


Réponse ORIGINALE pour Django <= 1.6

Essayez de mettre ceci dans votre urls.py

from Django.conf import settings

# ... your normal urlpatterns here

if settings.DEBUG:
    # static files (images, css, javascript, etc.)
    urlpatterns += patterns('',
        (r'^media/(?P<path>.*)$', 'Django.views.static.serve', {
        'document_root': settings.MEDIA_ROOT}))

Avec cela, vous pouvez servir le support statique à partir de Django lorsque DEBUG = True (lorsque vous exécutez sur un ordinateur local), mais vous pouvez laisser la configuration de votre serveur Web servir de support statique lorsque vous passez en production et DEBUG = False

242
Micah Carrick

Veuillez lire attentivement le texte officiel de Django DOC et vous obtiendrez la réponse qui vous convient le mieux.

Le meilleur moyen de résoudre ce problème est comme ci-dessous.

from Django.conf import settings
from Django.conf.urls.static import static

urlpatterns = patterns('',
    # ... the rest of your URLconf goes here ...
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
97
JChen___

Pour Django 1.9, vous devez ajouter le code suivant conformément à la documentation: 

from Django.conf import settings
from Django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Pour plus d'informations, vous pouvez vous référer ici: https://docs.djangoproject.com/fr/1.9/howto/static-files/#serving-files-uploaded-by-a-user-during-development

65
thisisashwani

Dois-je configurer des patrons URLconf spécifiques pour les médias téléchargés?

Oui. Pour le développement, il suffit d’ajouter ceci à votre URLconf:

if settings.DEBUG:
    urlpatterns += patterns('Django.views.static',
        (r'media/(?P<path>.*)', 'serve', {'document_root': settings.MEDIA_ROOT}),
    )

Toutefois, pour la production, vous souhaiterez desservir le support à l'aide d'Apache, de lighttpd, de nginx ou de votre serveur Web préféré.

22
mipadi

Voici ce que j'ai fait dans Django 2.0. Définissez d'abord MEDIA_ROOT un MEDIA_URL dans setting.py

MEDIA_ROOT = os.path.join(BASE_DIR, 'data/') # 'data' is my media folder
MEDIA_URL = '/media/'

Activez ensuite la mediacontext_processors dans TEMPLATE_CONTEXT_PROCESSORS en ajoutant 

TEMPLATES = [
{
    'BACKEND': 'Django.template.backends.Django.DjangoTemplates',
    'DIRS': [],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            #here add your context Processors
            'Django.template.context_processors.media',
        ],
    },
},
]

Votre media context processor est activé. Désormais, chaque RequestContext contiendra une variable MEDIA_URL.

Maintenant, vous pouvez accéder à cela dans votre template_name.html

<p><img src="{{ MEDIA_URL }}/image_001.jpeg"/></p>
12
Akhilendra yadav

(au moins) pour Django 1.8:

Si tu utilises

if settings.DEBUG:
  urlpatterns.append(url(r'^media/(?P<path>.*)$', 'Django.views.static.serve', {'document_root': settings.MEDIA_ROOT}))

comme décrit ci-dessus, assurez-vous qu'aucun modèle d'URL "intercepter tout", se dirigeant vers une vue par défaut, ne précède celui de urlpatterns = []. Comme .append mettra le schéma ajouté à la fin de la liste, il ne sera bien entendu testé que si aucun motif d'URL précédent ne correspond. Vous pouvez éviter cela en utilisant quelque chose comme ceci où le modèle d'URL "catch all" est ajouté à la fin, indépendamment de l'instruction if:

if settings.DEBUG:
    urlpatterns.append(url(r'^media/(?P<path>.*)$', 'Django.views.static.serve', {'document_root': settings.MEDIA_ROOT}))

urlpatterns.append(url(r'$', 'views.home', name='home')),
6
S. Ju.

Un autre problème que vous êtes susceptible de rencontrer après avoir configuré tous vos modèles URLconf est que la variable {{ MEDIA_URL }} ne fonctionnera pas dans vos modèles. Pour résoudre ce problème, dans votre settings.py , assurez-vous d’ajouter 

Django.core.context_processors.media

dans votre TEMPLATE_CONTEXT_PROCESSORS.

4
r_allela

Voici les modifications que j'ai dû apporter pour fournir des PDF à l'application Django-publications à l'aide de Django 1.10.6:

Utilisez les mêmes définitions pour les répertoires de supports que vous, dans settings.py:

MEDIA_ROOT = '/home/user/mysite/media/'

MEDIA_URL = '/media/'

Comme fourni par @thisisashwanipandey, dans le urls.py du projet:

from Django.conf import settings
from Django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

et une modification de la réponse fournie par @ r-allela, dans settings.py:

TEMPLATES = [
    {
        'BACKEND': 'Django.template.backends.Django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                # ... the rest of your context_processors goes here ...
                'Django.template.context_processors.media',
            ],
         },
    },
]
4
Alex Willison

Ajout à Micah Carrick réponse pour Django 1.8:

if settings.DEBUG:
  urlpatterns.append(url(r'^media/(?P<path>.*)$', 'Django.views.static.serve', {'document_root': settings.MEDIA_ROOT}))
2
user3894045

Ceci si pour Django 1.10: 

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

C'est ce que j'ai fait pour obtenir un rendu d'image en mode DEBUG = False en Python 3.6 avec Django 1.11

from Django.views.static import serve
urlpatterns = [
url(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}),
# other paths
]
1
comiventor

Votre réglage est correct. Certains serveurs Web exigent de spécifier spécifiquement les fichiers de supports statiques et de supports. Par exemple, dans pythonanywhere.com, vous devez accéder à la section "Web" et ajouter l'URL od, les dossiers multimédia et le dossier statique. Par exemple: 

  URL                     Directory                
/static/            /home/Saidmamad/discoverthepamirs/static     
/accounts/static/   /home/Saidmamad/discoverthepamirs/accounts/static    
/media/            /home/Saidmamad/discoverthepamirs/discoverthepamirs/media    

Je sais qu'il est tard, mais juste pour aider ceux qui visitent ce lien à cause du même problème;)

0
Saeed