2008-12-31 10 views
7

He configurado una aplicación Django que utiliza imágenes. Creo que configuré correctamente la configuración multimedia MEDIA_ROOT y MEDIA_URL. Sin embargo, las imágenes no aparecen. ¿Sabes cuál puede ser el problema?¿Cómo sirve Django los archivos multimedia?

Que considere este ejemplo:

Los archivos de imágenes se encuentran bajo /home/www/media/app/fotos y estamos tratando de solicitar http://example.com/photos/123.jpg

¿Debo usar estos ajustes?

MEDIA\_ROOT = /home/www/media 

MEDIA_URL = http://example.com/app 

ACTUALIZACIÓN: se olvidó de mencionar que estoy usando una función de servidor de desarrollo.

Respuesta

8

La prestación de contenido estático de Django es desaconsejado del propio desarrollador (si no estoy equivocado, solo funciona cuando está en modo de depuración). Deberías usar un servidor web dedicado, en cambio.

Si realmente necesita hacer eso, de todos modos, lea la documentación en how to serve static files.

+0

+1: enlace al doco. –

1

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

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

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

archivo httpd.conf parcial para PrinceOfPinot.com (También conocido como emergente):

<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> 
11

SOLAMENTE PARA EL DESARROLLO

Usted puede configurar un servidor de medios estáticos para su uso con su servidor de desarrollo al hacer 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'^$', 'views.index'),    

    # Accounts 
    (r'^accounts/login/$', 'views.user_login'), 
    (r'^accounts/logout/$', 'views.user_logout'), 

    # Contrib Modules 
    (r'^admin/(.*)', admin.site.root), 
) 

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

Pongo mi MEDIA_ROOT en un subdirectorio de HTML/medios de comunicación y enlace a ella como tal en settings.py

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

Después de finalizar el desarrollo, el proyecto se implementa en el servidor web donde los archivos de medios estáticos son servidos por Apache usando directivas.

+1

Sin embargo, en sus plantillas, ¿cómo haría referencia a un archivo CSS o un archivo de imagen? Supongamos que tiene su css en html/media/styles.css. –

0

Soy consciente de que la pregunta original es con el servidor dev, pero para cualquier otra persona que está en busca de una respuesta entorno de producción:

https://docs.djangoproject.com/en/1.8/howto/static-files/deployment/ proporciona una guía sobre cómo tener Django sirven 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

3

Esta es la forma correcta de mostrar archivos de imagen con ImageField. Imaginemos que tenemos una imagen 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 el camino que los datos de carga del usuario van. Esta es subdirectorio de FULL_PATH_OF_MEDIA, lo que significa que el archivo cargado tendrá

FULL_PATH_OF_MEDIA/PATH_TO_UPLOAD 

path.Now completa este contenido se puede acceder en la siguiente dirección:

SITE_NAME/URL_OF_MEDIA/PATH_TO_UPLOAD 

también recomiendo la lectura de este en static_files vs media_files

doc

Cuestiones relacionadas