Django MEDIA_URL e MEDIA_ROOT


229

Sto provando a caricare un'immagine tramite l'amministratore di Django e quindi visualizzare quell'immagine in una pagina sul frontend o semplicemente tramite un URL.

Nota che questo è tutto sul mio computer locale.

Le mie impostazioni sono le seguenti:

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

MEDIA_URL = '/media/'

Ho impostato il parametro upload_to su 'images' e il file è stato correttamente caricato nella directory:

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

Tuttavia, quando provo ad accedere all'immagine al seguente URL:

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

Ottengo un errore 404.

Devo configurare schemi URLconf specifici per i media caricati?

Qualche consiglio apprezzato.

Grazie.

Risposte:


293

AGGIORNAMENTO per Django> = 1.7

Documentazione Per Django 2.1: Elaborazione di file caricati da un utente durante lo sviluppo

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)

Non è più necessario in if settings.DEBUGquanto Django gestirà assicurandosi che venga utilizzato solo in modalità Debug.


Risposta ORIGINALE per Django <= 1.6

Prova a metterlo nel tuo 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}))

Con questo puoi servire i supporti statici da Django quando DEBUG = True(quando esegui sul computer locale) ma puoi lasciare che la configurazione del tuo server web serva i supporti statici quando vai in produzione eDEBUG = False


14
PS. Puoi quindi utilizzarlo nei tuoi modelli: <img src = "{{MEDIA_URL}} images / myimage.png" />
Micah Carrick

Non penso che sia utile aggiungere un ^segno prima media//(?P<path>.*)$, a volte quando accediamo al file multimediale nel percorso dell'URL dell'app (come http://127.0.0.1:8000/myapp/media/img/logo.png), questo normale non funzionerà in matematica.
Jack Zhang,

Faccio fatica da 2 giorni perché le mie immagini restituiscono 404. Questa è l'unica cosa che mi manca e non riesco a trovarla nel documento Django. Grazie.
tambalolo,

1
Se stai usando Django 1.5+, consulta la risposta di seguito; è una soluzione migliore.
Thane Brimhall,

è presente nella tua app o progetto urls.py?
user7804781,

105

Leggi attentamente il Django DOC ufficiale e troverai la risposta più adatta.

Il modo migliore e più semplice per risolvere questo è come di seguito.

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)

1
È una nuova funzionalità aggiunta in django 1.5
codeVerine

va bene usarlo in questo modo in produzione con apache?
andilabs,

1
@andi - No, non va bene usarlo in questo modo in produzione. Dovrebbe essere configurato tramite Apache sulla tua produzione.
Vikas Gulati,


1
Ma è OK lasciare questo codice qui in produzione senza if settings.DEVcontrollo perché è disabilitato automaticamente?
jozxyqk,

70

Per Django 1.9, è necessario aggiungere il seguente codice come da documentazione:

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)

Per maggiori informazioni, puoi fare riferimento qui: https://docs.djangoproject.com/en/1.9/howto/static-files/#serving-files-uploaded-by-a-user-during-development


2
Questa è la soluzione per django> 1.9, grazie.
unixeO

13
Assicurati solo di inserirlo nel file urls.py del tuo progetto e non della tua app, cosa ho fatto per caso.
Jarno,

3
Ha funzionato anche per me sull'1.10.
Deleet,

Non funziona per me. Forse ci sono delle impostazioni sottostanti necessarie in settings.py?
Fusion,

25

Ecco cosa ho fatto in Django 2.0. Impostare First MEDIA_ROOT su MEDIA_URL insetting.py

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

Quindi abilitare il media context_processors in TEMPLATE_CONTEXT_PROCESSORScon l'aggiunta di

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

Il tuo media context processorè abilitato, ora ognuno RequestContextconterrà una variabileMEDIA_URL .

Ora puoi accedere a questo nel tuo template_name.html

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

meravigliosamente spiegato - questa è stata la risposta per me. La chiave stava aggiungendo il processore di contesto multimediale .
David Maness,

23

Devo configurare schemi URLconf specifici per i media caricati?

Sì. Per lo sviluppo, è facile come aggiungere questo al tuo URLconf:

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

Tuttavia, per la produzione, ti consigliamo di servire i media usando Apache, lighttpd, nginx o il tuo server web preferito.


3
Cosa significa come si configura il server?
M Hornbacher,

Ricevo un riferimento irrisolto a "schemi", è importato da qualche parte?
user7804781,

6

(almeno) per Django 1.8:

Se usi

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

come descritto sopra, assicurati che nessun pattern url "catch all", indirizzato a una vista predefinita, preceda quello in urlpatterns = []. Dato che .append metterà lo schema aggiunto alla fine dell'elenco, sarà ovviamente testato solo se nessun modello di url precedente corrisponde. Puoi evitarlo usando qualcosa del genere in cui il pattern url "catch all" viene aggiunto alla fine, indipendentemente dall'istruzione 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

Ecco le modifiche che ho dovuto apportare per consegnare i PDF per le pubblicazioni di django app , usando Django 1.10.6:

Utilizzate le stesse definizioni per le vostre directory multimediali in settings.py:

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

MEDIA_URL = '/media/'

Come fornito da @thisisashwanipandey, nel progetto principale urls.py:

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)

e una modifica della risposta fornita da @ r-allela, in 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

Un altro problema che potresti incontrare dopo aver impostato tutti i tuoi pattern URLconf è che la variabile {{ MEDIA_URL }}non funzionerà nei tuoi template. Per risolvere questo problema, in settings.py , assicurati di aggiungere

django.core.context_processors.media

nel tuo TEMPLATE_CONTEXT_PROCESSORS.


2

Aggiungendo a Micah Carrick la risposta per Django 1.8:

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

1
Non funziona per me (1.10). TypeError: view must be a callable or a list/tuple in the case of include()..
Deleet,

2

Questo è quello che ho fatto per ottenere il rendering delle immagini in DEBUG = modalità False in Python 3.6 con Django 1.11

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

2

Seguendo i passaggi sopra menzionati per => 3.0 per la modalità Debug

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

E anche la parte che mi ha colpito, l'URL statico sopra ha funzionato solo nel mio file principale urls.py del progetto.Prima stavo provando ad aggiungere alla mia app e mi chiedevo perché non riuscivo a vedere le immagini.

Assicurati infine di impostare quanto segue:

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

1

Questo se per Django 1.10:

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

0

L'impostazione va bene. Alcuni server Web richiedono di specificare specificamente i file multimediali e le cartelle statiche. Ad esempio in pythonanywhere.com devi andare alla sezione "Web" e aggiungere l'URL delle cartelle multimediali e delle cartelle statiche. Per esempio:

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

So che è tardi, ma solo per aiutare coloro che visitano questo link a causa dello stesso problema;)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.