Django MEDIA_URL und MEDIA_ROOT


229

Ich versuche, ein Bild über den Django-Administrator hochzuladen und es dann entweder auf einer Seite im Frontend oder nur über eine URL anzuzeigen.

Beachten Sie, dass dies alles auf meinem lokalen Computer ist.

Meine Einstellungen sind wie folgt:

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

MEDIA_URL = '/media/'

Ich habe den Parameter upload_to auf 'images' gesetzt und die Datei wurde korrekt in das Verzeichnis hochgeladen:

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

Wenn ich jedoch versuche, unter der folgenden URL auf das Bild zuzugreifen:

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

Ich erhalte einen 404-Fehler.

Muss ich bestimmte URLconf-Muster für hochgeladene Medien einrichten?

Jeder Rat geschätzt.

Vielen Dank.

Antworten:


293

UPDATE für Django> = 1.7

Per Django 2.1-Dokumentation: Bereitstellen von Dateien, die von einem Benutzer während der Entwicklung hochgeladen wurden

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)

Sie brauchen nicht mehr, if settings.DEBUGda Django dafür sorgt, dass dies nur im Debug-Modus verwendet wird.


ORIGINAL Antwort für Django <= 1.6

Versuchen Sie, dies in Ihre urls.py einzufügen

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}))

Auf diese Weise können Sie die statischen Medien von Django aus bereitstellen, wenn DEBUG = True(wenn Sie auf einem lokalen Computer ausgeführt werden), aber Sie können Ihre Webserverkonfiguration statische Medien bereitstellen lassen, wenn Sie zur Produktion gehen undDEBUG = False


14
PS. Sie können dies dann in Ihren Vorlagen verwenden: <img src = "{{MEDIA_URL}} images / myimage.png" />
Micah Carrick

Ich denke nicht, dass es gut ist, ^vorher ein Zeichen hinzuzufügen media//(?P<path>.*)$. Manchmal, wenn wir auf die Mediendatei im App-URL-Pfad (wie http://127.0.0.1:8000/myapp/media/img/logo.png) zugreifen , wird dies nicht berechnet.
Jack Zhang

Ich habe jetzt seit 2 Tagen Probleme, warum meine Bilder 404 zurückgeben. Dies ist das einzige, was mir fehlt und ich kann es in Django doc nicht finden. Vielen Dank.
Tambalolo

1
Wenn Sie Django 1.5+ verwenden, lesen Sie bitte die Antwort unten. Es ist eine bessere Lösung.
Thane Brimhall

Ist dies in Ihrer App oder Ihrem Projekt urls.py?
user7804781

105

Bitte lesen Sie das offizielle Django DOC sorgfältig durch und Sie werden die passendste Antwort finden.

Der beste und einfachste Weg, dies zu lösen, ist wie folgt.

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
Es ist eine neue Funktion in Django 1.5
CodeVerine

Ist es in Ordnung, es in der Produktion mit Apache so zu verwenden?
Andilabs

1
@andi - Nein, es ist nicht in Ordnung, es so in der Produktion zu verwenden. Es sollte über Apache in Ihrer Produktion konfiguriert werden.
Vikas Gulati


1
Aber ist es in Ordnung, diesen Code hier in der Produktion ohne if settings.DEVÜberprüfung zu belassen, da er automatisch deaktiviert wird?
jozxyqk

70

Für Django 1.9 müssen Sie den folgenden Code gemäß der Dokumentation hinzufügen:

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)

Weitere Informationen finden Sie hier: https://docs.djangoproject.com/de/1.9/howto/static-files/#serving-files-uploaded-by-a-user-during-development


2
Dies ist die Lösung für Django> 1,9, danke.
UnixeO

13
Stellen Sie einfach sicher, dass Sie dies in die URLs Ihres Projekts und nicht in Ihre App einfügen , was ich versehentlich getan habe.
Jarno

3
Arbeitete auch für mich am 1.10.
Deleet

funktioniert bei mir nicht Möglicherweise gibt es in settings.py die erforderlichen Einstellungen?
Fusion

25

Hier, was ich in Django 2.0 gemacht habe. Setzen Sie zuerst MEDIA_ROOT und MEDIA_URL insetting.py

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

Aktivieren Sie dann das media context_processors In TEMPLATE_CONTEXT_PROCESSORSdurch Hinzufügen

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

Ihr media context processorist aktiviert. Jetzt enthält jeder RequestContexteine Variable MEDIA_URL.

Jetzt können Sie in Ihrem darauf zugreifen template_name.html

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

wunderbar erklärt - das war die Antwort für mich. Der Schlüssel war das Hinzufügen des Medienkontextprozessors .
David Maness

23

Muss ich bestimmte URLconf-Muster für hochgeladene Medien einrichten?

Ja. Für die Entwicklung ist es so einfach wie das Hinzufügen zu Ihrer URLconf:

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

Für die Produktion sollten Sie die Medien jedoch mit Apache, lighttpd, nginx oder Ihrem bevorzugten Webserver bereitstellen.


3
Was bedeutet das, wie konfigurieren Sie den Server?
M Hornbacher

Ich bekomme einen ungelösten Verweis auf "Muster". Wird das von irgendwoher importiert?
user7804781

6

(zumindest) für Django 1.8:

Wenn du benutzt

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

Stellen Sie wie oben beschrieben sicher, dass in urlpatterns = [] kein URL-Muster "Alle abfangen", das zu einer Standardansicht führt, davor steht. Da .append das hinzugefügte Schema an das Ende der Liste setzt, wird es natürlich nur getestet, wenn kein vorheriges URL-Muster übereinstimmt. Sie können dies vermeiden, indem Sie so etwas verwenden, bei dem das URL-Muster "catch all" ganz am Ende hinzugefügt wird, unabhängig von der if-Anweisung:

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

Hier sind die Änderungen, die ich vornehmen musste, um PDFs für die Django-Publikations- App mit Django 1.10.6 bereitzustellen:

Verwendete dieselben Definitionen für Medienverzeichnisse wie Sie in settings.py:

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

MEDIA_URL = '/media/'

Wie von @thisisashwanipandey bereitgestellt, im Hauptprojekt 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)

und eine Modifikation der Antwort von @ 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

Ein weiteres Problem, mit dem Sie wahrscheinlich konfrontiert werden, nachdem Sie alle URLconf-Muster eingerichtet haben, ist, dass die Variable {{ MEDIA_URL }}in Ihren Vorlagen nicht funktioniert. Um dies zu beheben , stellen Sie in Ihrer settings.py sicher, dass Sie hinzufügen

django.core.context_processors.media

in deinem TEMPLATE_CONTEXT_PROCESSORS.


2

Hinzufügen zu Micah Carrick Antwort für Django 1.8:

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

1
Funktioniert bei mir nicht (1.10). TypeError: view must be a callable or a list/tuple in the case of include()..
Deleet

2

Dies habe ich getan, um in Python 3.6 mit Django 1.11 das Rendern von Bildern im DEBUG = False-Modus zu erreichen

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

2

Befolgen Sie die oben genannten Schritte für => 3.0 für den Debug-Modus

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

Und auch der Teil, der mich auffiel , die obige statische URL funktionierte nur in meiner Hauptprojekt-URL urls.py. Ich habe zuerst versucht, meiner App etwas hinzuzufügen, und mich gefragt, warum ich die Bilder nicht sehen konnte.

Stellen Sie zuletzt sicher, dass Sie Folgendes einstellen:

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

1

Dies gilt für Django 1.10:

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

0

Ihre Einstellung ist in Ordnung. Einige Webserver müssen die Medien- und statischen Ordnerdateien speziell angeben. In pythonanywhere.com müssen Sie beispielsweise zum Abschnitt "Web" gehen und die URL der Medienordner und des statischen Ordners hinzufügen. Beispielsweise:

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

Ich weiß, dass es spät ist, aber nur um denen zu helfen, die diesen Link wegen des gleichen Problems besuchen;)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.