Django MEDIA_URL und MEDIA_ROOT

Lesezeit: 4 Minuten

Benutzer-Avatar
Dan

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

Beachten Sie, dass sich dies alles auf meinem lokalen Computer befindet.

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, auf das Bild unter der folgenden URL 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.

Benutzer-Avatar
Micha Carrick

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.DEBUG da Django dafür sorgt, dass dies nur im Debug-Modus verwendet wird.


ORIGINAL-Antwort für Django <= 1.6

Versuchen Sie, dies in Ihre einzufügen 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}))

Damit können Sie die statischen Medien von Django aus bedienen, wenn DEBUG = True (wenn Sie auf einem lokalen Computer ausgeführt werden), aber Sie können Ihre Webserverkonfiguration statische Medien bereitstellen lassen, wenn Sie in die Produktion gehen und DEBUG = False

  • PS. Diese können Sie dann in Ihren Vorlagen verwenden: myimage

    – Micha Carrick

    1. April 2011 um 19:45 Uhr

  • Ich denke nicht, dass es gut ist, hinzuzufügen ^ vorher unterschreiben media//(?P<path>.*)$irgendwann, wenn wir auf Mediendateien im App-URL-Pfad zugreifen (wie http://127.0.0.1:8000/myapp/media/img/logo.png), wird dieser reguläre nicht rechnen.

    – Jack Zhang

    25. Juli 2013 um 6:51 Uhr

  • 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

    12. August 2013 um 2:45 Uhr


  • Wenn Sie Django 1.5+ verwenden, lesen Sie bitte die Antwort unten; es ist eine bessere Lösung.

    – Thane Brimhall

    6. April 2016 um 14:14 Uhr

  • ist dies in Ihrer App oder Ihrem Projekt urls.py?

    – Benutzer7804781

    13. Februar 2018 um 16:07 Uhr

Benutzer-Avatar
JChen___

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)

  • Es ist eine neue Funktion, die in Django 1.5 hinzugefügt wurde

    – codeVerine

    31. Juli 2013 um 11:38 Uhr

  • Ist es in Ordnung, es auf diese Weise in der Produktion mit Apache zu verwenden?

    – Andilabs

    28. Januar 2014 um 16:51 Uhr

  • @andi – Nein, es ist nicht in Ordnung, es auf diese Weise in der Produktion zu verwenden. Es sollte über Apache in Ihrer Produktion konfiguriert werden.

    – Vikas Gulati

    20. März 2014 um 10:22 Uhr

  • Im 1.7 docs.djangoproject.com/en/1.7/howto/static-files/…

    – ErDmKo

    13. November 2014 um 6:41 Uhr


  • Aber es ist in Ordnung, diesen Code hier in der Produktion mit no zu belassen if settings.DEV überprüfen, weil es automatisch deaktiviert wird?

    – jozxyqk

    1. November 2015 um 12:08 Uhr

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/en/1.9/howto/static-files/#serving-files-uploaded-by-a-user-during-development

  • Dies ist die Lösung für Django > 1.9, danke.

    – Unixeo

    11. Januar 2016 um 22:32 Uhr

  • Stellen Sie einfach sicher, dass Sie dies in die urls.py Ihrer Datei einfügen Projekt und nicht von Ihrer App, was ich versehentlich getan habe.

    – Jarno

    28. April 2016 um 16:05 Uhr

  • Hat bei mir auch am 1.10 funktioniert.

    – CoderGuy123

    17. August 2016 um 22:42 Uhr

  • funktioniert bei mir nicht. Vielleicht gibt es irgendwelche notwendigen zugrunde liegenden Einstellungen in settings.py?

    – Verschmelzung

    5. Mai 2017 um 0:40 Uhr

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

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

Aktivieren Sie dann die media context_processors in TEMPLATE_CONTEXT_PROCESSORS beim 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',
        ],
    },
},
]

Dein media context processor aktiviert ist, jetzt alle RequestContext enthält eine Variable MEDIA_URL.

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

<p><img src="https://stackoverflow.com/questions/5517950/{{ MEDIA_URL }}/image_001.jpeg"/></p>

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

Ja. Für die Entwicklung ist es so einfach, dies zu Ihrer URLconf hinzuzufügen:

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.

  • Was bedeutet das, wie konfiguriert man den Server?

    – Menachem Hornbacher

    21. April 2017 um 13:05 Uhr

  • Ich erhalte einen nicht aufgelösten Verweis auf „Patterns“, ist das irgendwo importiert?

    – Benutzer7804781

    13. Februar 2018 um 16:04 Uhr

Benutzer-Avatar
S. Ju.

(mindestens) 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 “catch all”-URL-Muster, das auf eine Standardansicht verweist, 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")),

  • Was bedeutet das, wie konfiguriert man den Server?

    – Menachem Hornbacher

    21. April 2017 um 13:05 Uhr

  • Ich erhalte einen nicht aufgelösten Verweis auf „Patterns“, ist das irgendwo importiert?

    – Benutzer7804781

    13. Februar 2018 um 16:04 Uhr

Hier sind die Änderungen, die ich vornehmen musste, um PDFs für die zu liefern Django-Veröffentlichungen App mit Django 1.10.6:

Verwendet die gleichen Definitionen für Medienverzeichnisse wie Sie, in settings.py:

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

MEDIA_URL = '/media/'

Wie von @thisisashwanipandey bereitgestellt, in der Hauptdatei des Projekts 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',
            ],
         },
    },
]

1071130cookie-checkDjango MEDIA_URL und MEDIA_ROOT

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy