Django MEDIA_URL e MEDIA_ROOT

Estou tentando fazer upload de uma imagem através do administrador do Django e, em seguida, ver essa imagem em uma página no frontend ou apenas através de um URL.

Note que isso é tudo na minha máquina local.

Minhas configurações são as seguintes:

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

Eu configurei o parâmetro upload_to para ‘images’ e o arquivo foi carregado corretamente para o diretório:

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

No entanto, quando tento acessar a imagem no seguinte URL:

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

Eu recebo um erro 404.

Preciso configurar padrões específicos de URLconf para mídia carregada?

Qualquer conselho apreciado.

Obrigado.

Tente colocar isso no seu 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.*)$', 'django.views.static.serve', { 'document_root': settings.MEDIA_ROOT})) 

Com isso você pode servir a mídia estática do Django quando DEBUG = True (quando você roda em um computador local), mas você pode permitir que a configuração do seu servidor web sirva mídia estática quando você vai para produção e DEBUG = False

Por favor, leia atentamente o Django DOC oficial e você encontrará a resposta mais adequada.

A melhor maneira e easist para resolver isso é como abaixo.

 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) 

Para o Django 1.9, você precisa adicionar o seguinte código conforme a documentação:

 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) 

Para mais informações, você pode consultar aqui: https://docs.djangoproject.com/en/1.9/howto/static-files/#serving-files-uploaded-by-a-user-during-development

Preciso configurar padrões específicos de URLconf para mídia carregada?

Sim. Para o desenvolvimento, é tão fácil quanto adicionar isso ao seu URLconf:

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

Entretanto, para produção, você desejará servir a mídia usando Apache, lighttpd, nginx ou seu servidor da Web preferido.

Aqui o que eu fiz no Django 2.0. Definir primeiro MEDIA_ROOT e MEDIA_URL em setting.py

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

Em seguida, ative os media context_processors em TEMPLATE_CONTEXT_PROCESSORS adicionando

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

Seu media context processor está ativado. Agora, cada RequestContext conterá uma variável MEDIA_URL .

Agora você pode acessar isso em seu template_name.html

 

(pelo menos) para o Django 1.8:

Se você usar

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

como descrito acima, certifique-se de que nenhum padrão de URL “catch all”, direcionando para uma visualização padrão, venha antes disso em urlpatterns = []. Como .append colocará o esquema adicionado no final da lista, obviamente só será testado se nenhum padrão de URL anterior corresponder. Você pode evitar isso usando algo assim, onde o padrão de URL “catch all” é adicionado no final, independente da instrução if:

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

Outro problema que você provavelmente enfrentará após configurar todos os seus padrões de URLconf é que a variável {{ MEDIA_URL }} não funcionará em seus modelos. Para corrigir isso, no seu settings.py , certifique-se de adicionar

django.core.context_processors.media

em seu TEMPLATE_CONTEXT_PROCESSORS .

Aqui estão as mudanças que eu tive que fazer para entregar PDFs para o aplicativo django-publications , usando o Django 1.10.6:

Usou as mesmas definições para os diretórios de mídia que você, em settings.py :

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

Conforme fornecido por @thisisashwanipandey, no urls.py principal do projeto:

 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 uma modificação da resposta fornecida por @ r-allela, em 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', ], }, }, ] 

Adicionando a resposta de Micah Carrick para o django 1.8:

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

Este if para o Django 1.10:

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

Sua configuração está bem. Alguns servidores da Web precisam especificar especificamente a mídia e os arquivos de pasta estática. Por exemplo, em pythonanywhere.com você tem que ir para a seção ‘Web’ e adicionar a URL das pastas de mídia e da pasta estática. Por exemplo:

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

Eu sei que é tarde, mas só para ajudar quem visita esse link por causa do mesmo problema;)