Django MEDIA_URL ve MEDIA_ROOT


229

Django yöneticisi aracılığıyla bir resim yüklemek ve sonra bu görüntüyü ya ön uçtaki bir sayfada ya da sadece bir URL üzerinden görüntülemek çalışıyorum.

Tüm bunların yerel makinemde olduğunu unutmayın.

Ayarlarım aşağıdaki gibidir:

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

MEDIA_URL = '/media/'

Upload_to parametresini 'images' olarak ayarladım ve dosya dizine doğru şekilde yüklendi:

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

Ancak, resme aşağıdaki URL'den erişmeye çalıştığımda:

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

404 hatası alıyorum.

Yüklenen medya için belirli URLconf kalıpları ayarlamam gerekir mi?

Herhangi bir tavsiye takdir.

Teşekkürler.

Yanıtlar:


293

Django için GÜNCELLEME> = 1.7

Django 2.1 belgelerine göre: Bir kullanıcı tarafından geliştirme sırasında yüklenen dosyaları sunma

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)

if settings.DEBUGDjango bunun yalnızca Hata Ayıklama modunda kullanıldığından emin olacağından artık ihtiyacınız yok .


Django için ORİJİNAL cevap <= 1.6

Bunu urls.py'nize koymayı deneyin

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

Bununla DEBUG = True(yerel bilgisayarda çalıştırdığınızda) Django'dan statik medya sunabilir, ancak üretime gittiğinizde web sunucusu yapılandırmanızın statik medya sunmasına izin verebilirsiniz veDEBUG = False


14
PS. Daha sonra bunu şablonlarınızda kullanabilirsiniz: <img src = "{{MEDIA_URL}} images / myimage.png" />
Micah Carrick

Daha ^önce işaret eklemenin iyi olduğunu düşünmüyorum media//(?P<path>.*)$, bazen uygulama url yolundaki medya dosyasına eriştiğimizde (örneğin http://127.0.0.1:8000/myapp/media/img/logo.png), bu normal matematik olmayacak.
Jack Zhang

2 gündür görüntülerim neden 404'e dönüyor. Teşekkürler.
tambalolo

1
Django 1.5+ kullanıyorsanız, lütfen aşağıdaki cevaba bakınız; daha iyi bir çözümdür.
Thane Brimhall

Bu uygulama veya proje urls.py nedir?
user7804781

105

Lütfen resmi Django DOC'u dikkatlice okuyun ve size en uygun cevabı bulacaksınız.

Bunu çözmenin en iyi ve kolay yolu aşağıdaki gibidir.

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
Django 1.5'te eklenen yeni bir özelliktir
codeVerine

apache ile üretimde bu şekilde kullanmak uygun mudur?
andilabs

1
@andi - Hayır, üretimde bu şekilde kullanmak doğru değil. Üretiminizdeki apache üzerinden yapılandırılmalıdır.
Vikas Gulati


1
Ancak if settings.DEVotomatik olarak devre dışı bırakıldığı için bu kodu burada kontrolsüz olarak bırakmak doğru olur mu?
jozxyqk

70

Django 1.9 için, belgelere göre aşağıdaki kodu eklemeniz gerekir:

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)

Daha fazla bilgi için buraya başvurabilirsiniz: https://docs.djangoproject.com/en/1.9/howto/static-files/#serving-files-uploaded-by-a-user-during-development


2
Bu django> 1.9, thnks için bir çözümdür.
unixeO

13
Bunu , uygulamanızın değil, yanlışlıkla yaptığım projenin urls.py'sine koyduğunuzdan emin olun .
Jarno

3
Benim için de 1.10 üzerinde çalıştı.
Deleet

benim için çalışmıyor. Belki settings.py dosyasında altta yatan herhangi bir ayar vardır.
Füzyon

25

İşte Django 2.0 ne yaptım. Önce MEDIA_ROOT bir MEDIA_URL ayarlayınsetting.py

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

Sonra Enable media context_processors içinde TEMPLATE_CONTEXT_PROCESSORSekleyerek

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

Kişisel media context processorisimli Artık her etkinleştirilmiş RequestContextbir değişken içerecektir MEDIA_URL.

Şimdi buna template_name.html

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

harika açıkladı - bu benim için cevaptı. Anahtar medya içerik işlemcisini eklemektir .
David Maness

23

Yüklenen medya için belirli URLconf kalıpları ayarlamam gerekir mi?

Evet. Geliştirme için, bunu URL bağlantınıza eklemek kadar kolaydır:

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

Ancak prodüksiyon için medyaya Apache, lighttpd, nginx veya tercih ettiğiniz web sunucusunu kullanarak hizmet etmek istersiniz.


3
Bu sunucuyu nasıl yapılandırdığınız anlamına gelir?
M Hornbacher

"Desenler" için çözümlenmemiş bir başvuru alıyorum, bu bir yerden mi ithal ediliyor?
user7804781

6

(en azından) Django 1.8 için:

Eğer kullanırsan

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

Yukarıda açıklandığı gibi, varsayılan görünüme yönlendiren hiçbir "tümünü yakalama" URL kalıbının urlpatterns = [] öğesinden önce gelmediğinden emin olun. .Append eklenen şemayı listenin sonuna koyacağından, elbette yalnızca önceki url kalıbı eşleşmediğinde test edilecektir. İf ifadesinden bağımsız olarak en sonunda "tümünü yakala" URL modelinin eklendiği böyle bir şey kullanarak bunu önleyebilirsiniz:

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

Django 1.10.6 kullanarak , django yayınları uygulaması için PDF teslim etmek için yapmak zorunda olduğum değişiklikler şunlardır :

Sizin kadar medya dizinleri için aynı tanımlara Kullanılan settings.py:

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

MEDIA_URL = '/media/'

Projenin ana bölümünde @thisisashwanipandey tarafından sağlandığı gibi 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)

ve @ r-allela tarafından verilen cevabın aşağıdaki şekilde değiştirilmesi 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

Tüm URLconf kalıplarınızı ayarladıktan sonra karşılaşabileceğiniz bir diğer sorun, değişkenin {{ MEDIA_URL }}şablonlarınızda çalışmayacağıdır. Bunu düzeltmek için settings.py dosyasında şunu eklediğinizden emin olun:

django.core.context_processors.media

sizin TEMPLATE_CONTEXT_PROCESSORS.


2

Django 1.8 için Micah Carrick cevabına ekleme:

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

1
Benim için çalışmıyor (1.10). TypeError: view must be a callable or a list/tuple in the case of include()..
Deleet

2

Django 1.11 ile Python 3.6 DEBUG = yanlış modda görüntü oluşturma elde etmek için yaptığım budur

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

2

Hata ayıklama modu için => 3.0 için yukarıda belirtilen adımları izleyin

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

Ve beni yakalayan kısım , yukarıdaki statik URL sadece ana proje urls.py dosyamda çalıştı. İlk olarak uygulamama eklemeye çalışıyordum ve görüntüleri neden göremediğimi merak ediyordum.

Son olarak aşağıdakileri ayarladığınızdan emin olun:

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

1

Bu Django 1.10 için ise:

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

0

Sizin ayarınız iyi. Bazı web sunucularının özellikle medya ve statik klasör dosyalarını belirtmesi gerekir. Örneğin pythonanywhere.com'da 'Web' bölümüne gitmeli ve medya klasörleri ile statik klasör URL'lerini eklemelisiniz. Örneğin:

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

Geç olduğunu biliyorum, ama aynı bağlantı nedeniyle bu bağlantıyı ziyaret edenlere yardımcı olmak için;)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.