Pregunta

He configurado una aplicación Django que utiliza imágenes. Creo que he configurado correctamente los ajustes de medios MEDIA_ROOT y MEDIA_URL. Sin embargo las imágenes no aparecen. ¿Sabes cuál puede ser el problema?

Consideremos este ejemplo:

Los archivos de imagen están en / home / www / media / app / photos y estamos intentando solicitar http://example.com/photos/123.jpg

¿Debo usar esta configuración?

MEDIA\_ROOT = /home/www/media

MEDIA_URL = http://example.com/app

ACTUALIZACIÓN: olvidé mencionar que estoy usando el servidor de desarrollo incorporado.

¿Fue útil?

Solución

Servir el contenido estático de Django es desalentado del desarrollador (si no me equivoco, solo funciona en modo de depuración). En su lugar, debe utilizar un servidor web dedicado.

Si realmente necesitas hacer eso, de todos modos, lee la documentación en cómo para servir archivos estáticos .

Otros consejos

SOLO PARA DESARROLLO

Puede configurar un servidor de medios estáticos para usar con su servidor de desarrollo haciendo esto en su archivo urls.py . He adjuntado el código que muestra cómo lo uso (junto con los condicionales DEBUG forzados).

from django.conf import settings
from django.conf.urls.defaults import *      

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('', 
    (r'^

Coloco mi MEDIA_ROOT en un subdirectorio de html / media y lo vinculo como tal en settings.py

MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'html/media/').replace('\\','/')

Una vez finalizado el desarrollo, el proyecto se implementa en el servidor web donde los archivos de medios estáticos se procesan mediante Apache usando directivas.

, 'views.index'), # Accounts (r'^accounts/login/

Coloco mi MEDIA_ROOT en un subdirectorio de html / media y lo vinculo como tal en settings.py

<*>

Una vez finalizado el desarrollo, el proyecto se implementa en el servidor web donde los archivos de medios estáticos se procesan mediante Apache usando directivas.

, 'views.user_login'), (r'^accounts/logout/

Coloco mi MEDIA_ROOT en un subdirectorio de html / media y lo vinculo como tal en settings.py

<*>

Una vez finalizado el desarrollo, el proyecto se implementa en el servidor web donde los archivos de medios estáticos se procesan mediante Apache usando directivas.

, 'views.user_logout'), # Contrib Modules (r'^admin/(.*)', admin.site.root), ) if settings.DEBUG : urlpatterns += patterns('', (r'^media/(?P<path>.*)

Coloco mi MEDIA_ROOT en un subdirectorio de html / media y lo vinculo como tal en settings.py

<*>

Una vez finalizado el desarrollo, el proyecto se implementa en el servidor web donde los archivos de medios estáticos se procesan mediante Apache usando directivas.

, 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT, 'show_indexes': True}), )

Coloco mi MEDIA_ROOT en un subdirectorio de html / media y lo vinculo como tal en settings.py

<*>

Una vez finalizado el desarrollo, el proyecto se implementa en el servidor web donde los archivos de medios estáticos se procesan mediante Apache usando directivas.

Esta es la forma correcta de mostrar archivos de imagen con ImageField. Imagina que tenemos una foto de perfil de usuario:

models.py:

UserProfile:
    profilePic= models.ImageField( upload_to='PATH_TO_UPLOAD', blank=True, null=True)

settings.py:

MEDIA_ROOT = 'FULL_PATH_OF_MEDIA'
MEDIA_URL = 'URL_OF_MEDIA'

urls.py:

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

PATH_TO_UPLOAD es la ruta a la que van los datos de carga del usuario. Este es un subdirectorio de FULL_PATH_OF_MEDIA, lo que significa que el archivo cargado tendrá

FULL_PATH_OF_MEDIA/PATH_TO_UPLOAD 

ruta completa. Ahora se puede acceder a este contenido en esta url:

SITE_NAME/URL_OF_MEDIA/PATH_TO_UPLOAD

También recomiendo leer esto en static_files vs media_files

doc

Sospecho que estás recibiendo la página Django 404. Intente acceder directamente a una de sus imágenes y vea si está sucediendo.

Si es así, debe configurar su servidor web para que no envíe solicitudes dentro de su jerarquía de medios a Django, pero en su lugar, las sirva directamente. Aquí hay un recorte de mi archivo conf de Apache. La primera sección le dice a Apache que envíe todo a Django. La segunda sección tiene " SetHandler None " que dice "manejar las cosas en / media de la forma normal". "

Consulte http://docs.djangoproject.com/en/dev / howto / deployment / modpython / para todos los detalles interesantes.

Archivo httpd.conf parcial para PrinceOfPinot.com (AKA pop):

<Location "/">
    SetHandler python-program
    PythonAutoReload Off
    PythonDebug Off
    PythonPath "['/var/www/production/pop', '/usr/local/lib/python2.5/site-packages/django'] + sys.path"
    SetEnv DJANGO_SETTINGS_MODULE settings
    PythonHandler django.core.handlers.modpython
</Location>

<Location "/media">
    SetHandler None
    AddOutputFilterByType DEFLATE text/html text/css application/x-javascript
</Location>

Soy consciente de que la pregunta original es con el servidor dev, pero para cualquier otra persona que esté buscando un entorno de producción, responda:

https://docs.djangoproject.com/en/1.8 / howto / static-files / deploy / proporciona una guía sobre cómo hacer que django sirva los archivos en un entorno de producción. Desde el tono de la guía, parece implicar que es mejor tener un servidor web separado para manejar los archivos o usar mod_wsgi con Apache

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top