django - debug - media root
Django MEDIA_URL y MEDIA_ROOT (11)
Intento subir una imagen a través del administrador de Django y luego ver esa imagen en una página en la interfaz o simplemente a través de una URL.
Tenga en cuenta que todo esto está en mi máquina local.
Mi configuración es la siguiente:
MEDIA_ROOT = ''/home/dan/mysite/media/''
MEDIA_URL = ''/media/''
Establecí el parámetro upload_to en ''imágenes'' y el archivo se ha cargado correctamente en el directorio:
''/home/dan/mysite/media/images/myimage.png''
Sin embargo, cuando intento acceder a la imagen en la siguiente URL:
http://127.0.0.1:8000/media/images/myimage.png
Me sale un error 404.
¿Debo configurar patrones específicos de URLconf para los medios cargados?
Cualquier consejo apreciado.
Gracias.
¿Debo configurar patrones específicos de URLconf para los medios cargados?
Sí. Para el desarrollo, es tan fácil como agregar esto a su URLconf:
if settings.DEBUG:
urlpatterns += patterns(''django.views.static'',
(r''media/(?P<path>.*)'', ''serve'', {''document_root'': settings.MEDIA_ROOT}),
)
Sin embargo, para la producción, querrá servir los medios usando Apache, lighttpd, nginx o su servidor web preferido.
(al menos) para Django 1.8:
Si utiliza
if settings.DEBUG:
urlpatterns.append(url(r''^media/(?P<path>.*)$'', ''django.views.static.serve'', {''document_root'': settings.MEDIA_ROOT}))
como se describió anteriormente, asegúrese de que ningún patrón de URL "catch all", que dirige a una vista predeterminada, aparezca antes que en urlpatterns = []. Como .append colocará el esquema agregado al final de la lista, por supuesto, solo se probará si no coincide ningún patrón de URL anterior. Puede evitar eso usando algo como esto donde el patrón de URL "catch all" se agrega al final, independientemente de la instrucción if:
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'')),
Agregando a Micah Carrick respuesta para django 1.8:
if settings.DEBUG:
urlpatterns.append(url(r''^media/(?P<path>.*)$'', ''django.views.static.serve'', {''document_root'': settings.MEDIA_ROOT}))
Aquí están los cambios que tuve que hacer para entregar archivos PDF para la aplicación django-publications , usando Django 1.10.6:
Usó las mismas definiciones para los directorios de medios que usted, en settings.py
:
MEDIA_ROOT = ''/home/user/mysite/media/''
MEDIA_URL = ''/media/''
Según lo provisto por @thisisashwanipandey, en el urls.py
principal del proyecto:
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)
y una modificación de la respuesta provista por @r-allela, en 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'',
],
},
},
]
Aquí lo que hice en Django 2.0. Establezca First MEDIA_ROOT en MEDIA_URL en setting.py
MEDIA_ROOT = os.path.join(BASE_DIR, ''data/'') # ''data'' is my media folder
MEDIA_URL = ''/media/''
Luego habilite los media
context_processors
en TEMPLATE_CONTEXT_PROCESSORS
agregando
TEMPLATES = [
{
''BACKEND'': ''django.template.backends.django.DjangoTemplates'',
''DIRS'': [],
''APP_DIRS'': True,
''OPTIONS'': {
''context_processors'': [
#here add your context Processors
''django.template.context_processors.media'',
],
},
},
]
Su media context processor
está habilitado, ahora cada RequestContext
contendrá una variable MEDIA_URL
.
Ahora puede acceder a esto en su template_name.html
<p><img src="{{ MEDIA_URL }}/image_001.jpeg"/></p>
Esto si para Django 1.10:
if settings.DEBUG:
urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Intenta poner esto en tu 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}))
Con esto puede servir los medios estáticos de Django cuando DEBUG = True
(cuando se ejecuta en una computadora local) pero puede permitir que la configuración de su servidor web sirva para medios estáticos cuando vaya a producción y DEBUG = False
Lea detenidamente el Django DOC oficial y encontrará la respuesta más adecuada.
La mejor y más fácil manera de resolver esto es como a continuación.
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)
Otro problema que probablemente enfrente después de configurar todos sus patrones de URLconf es que la variable {{ MEDIA_URL }}
no funcionará en sus plantillas. Para solucionar esto, en su settings.py , asegúrese de agregar
django.core.context_processors.media
en tu TEMPLATE_CONTEXT_PROCESSORS
.
Para Django 1.9, debe agregar el siguiente código según la documentación:
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 obtener más información, puede consultar aquí: https://docs.djangoproject.com/en/1.9/howto/static-files/#serving-files-uploaded-by-a-user-during-development
Tu configuración está bien. Algunos servidores web requieren especificar los medios y archivos de carpetas estáticas específicamente. Por ejemplo, en pythonanywhere.com debe ir a la sección ''Web'' y agregar la URL de las carpetas multimedia y la carpeta estática. Por ejemplo:
URL Directory
/static/ /home/Saidmamad/discoverthepamirs/static
/accounts/static/ /home/Saidmamad/discoverthepamirs/accounts/static
/media/ /home/Saidmamad/discoverthepamirs/discoverthepamirs/media
Sé que es tarde, pero solo para ayudar a quienes visitan este enlace debido al mismo problema;)