web-dev-qa-db-de.com

Django MEDIA_URL und MEDIA_ROOT

Ich versuche, ein Bild über den Django-Administrator hochzuladen und das Bild dann entweder auf einer Seite im Frontend oder einfach ü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, auf das Bild unter der folgenden URL zuzugreifen:

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

Ich bekomme eine 404-Fehlermeldung.

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

Jeder Rat wird geschätzt.

Vielen Dank.

189
Dan

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 if settings.DEBUG nicht mehr, da Django sicherstellt, dass dies nur im Debug-Modus verwendet wird.


ORIGINAL Antwort für Django <= 1.6

Fügen Sie dies in Ihre urls.py ein.

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 bereitstellen, wenn DEBUG = True (wenn Sie auf einem lokalen Computer ausgeführt werden), Sie können jedoch zulassen, dass Ihre Webserverkonfiguration statische Medien verwendet, wenn Sie zur Produktion gehen und DEBUG = False

242
Micah Carrick

Bitte lies den offiziellen Django DOC sorgfältig durch und du wirst 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)
97
JChen___

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

65
thisisashwani

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

Ja. Für die Entwicklung ist dies 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.

22
mipadi

Hier was ich in Django 2.0 gemacht habe. Setze zuerst MEDIA_ROOT eine MEDIA_URL in setting.py

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

Aktivieren Sie dann die Variable mediacontext_processors in TEMPLATE_CONTEXT_PROCESSORS durch 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 processor ist aktiviert. Jetzt enthält jede RequestContext eine Variable MEDIA_URL.

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

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

(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 URL-Mustern = [] kein "catch all" -URl-Muster vor einer Standardansicht angezeigt wird. Da .append das hinzugefügte Schema an das Ende der Liste setzt, wird es natürlich nur getestet, wenn kein vorheriges URL-Muster passt. Sie können dies vermeiden, indem Sie etwas wie das 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
S. Ju.

Ein anderes Problem, dem Sie wahrscheinlich nach dem Einrichten all Ihrer URLconf-Muster gegenüberstehen, 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 Ihrem TEMPLATE_CONTEXT_PROCESSORS.

4
r_allela

Hier sind die Änderungen, die ich vornehmen musste, um PDFs für die Django-publications -Anwendung mithilfe von Django 1.10.6 bereitzustellen:

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

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

MEDIA_URL = '/media/'

Wie von @thisisashwanipandey bereitgestellt, im Hauptcode 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',
            ],
         },
    },
]
4
Alex Willison

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

Wenn für Django 1.10: 

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

So habe ich in Python 3.6 mit Django 1.11 Bildwiedergabe im Modus DEBUG = False erzielt

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

Ihre Einstellung ist in Ordnung. Bei einigen Webservern müssen die Medien- und statischen Ordnerdateien spezifisch angegeben werden. In pythonanywhere.com müssen Sie beispielsweise zum Abschnitt "Web" gehen und die URL od, die Medienordner und den statischen Ordner hinzufügen. Zum Beispiel: 

  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 besuchen, wegen des gleichen Problems;)

0
Saeed