no se puede imaginar el servicio de imágenes estáticas en el entorno django dev

He leído el artículo (y algunos otros sobre el tema), pero aún no puedo descubrir cómo mostrar una imagen a menos que el enlace a un archivo existente en un servicio web esté codificado en la plantilla html.

Tengo en urls.py :

... (r'^galleries/(landscapes)/(?P.jpg)$', 'django.views.static.serve', {'document_root': settings.MEDIA_URL}), ... 

donde ‘paisajes’ es uno de los álbumes de los que estoy tratando de mostrar imágenes. (Hay varios más de ellos).

En views.py llama a la plantilla con código así:

 ... 
  • ...

    lo que resuelve el enlace de imagen en html en:

     http://127.0.0.1:8000/galleries/landscapes/http://sofes.miximages.com/image/160.jpg 

    En settings.py tengo:

     MEDIA_ROOT = 'C:/siteURL/galleries/' MEDIA_URL = 'http://some-good-URL/galleries/' 

    En el sistema de archivos hay un archivo C: /siteURL/galleries/landscapes/http://sofes.miximages.com/image/160.jpg y tengo el mismo archivo en http: //some-good-URL/galleries/landscapes/http://sofes.miximages.com/image/160.jpg

    No importa lo que use en urls.py – MEDIA_ROOT o MEDIA_URL (con la expectativa de que se sirvan imágenes locales o del servidor web) – Recibo el siguiente código de fuente en el navegador:

     
  • No hay imagen mostrada en el navegador.

    ¿Qué estoy haciendo mal?

    Este es un post largo, que básicamente resume todas las cosas que aprendí sobre Django para que funcionen los archivos estáticos (me tomó un tiempo comprender cómo encajan las diferentes partes).

    Para servir imágenes estáticas en su servidor de desarrollo (y más tarde, su servidor real), tendrá que hacer algunas cosas (tenga en cuenta específicamente los pasos tercero y cuarto):

    Establecer MEDIA_ROOT

    MEDIA_ROOT es una constante que le dice a Django la ruta física del archivo (en su sistema de archivos). Usando tu ejemplo, MEDIA_ROOT debe configurarse en ‘C: / siteURL / galleries /’, como escribiste. MEDIA_ROOT se utilizará en uno de los siguientes pasos, por eso lo configuramos.

    Establecer MEDIA_URL

    MEDIA_URL es la “url” en la que se encuentran tus imágenes. En otras palabras, siempre que desee obtener una imagen, la url para buscar comienza con MEDIA_URL. Por lo general, esto no va a comenzar con “http”, ya que está sirviendo desde su propio servidor (mi MEDIA_URL generalmente se establece en ‘/ site_media /’, es decir, para comenzar desde el dominio raíz, luego vaya a site_media, etc.)

    Utilizar MEDIA_URL

    MEDIA_URL no funciona por magia, realmente tienes que usarlo. Por ejemplo, cuando estás escribiendo el HTML que obtiene un archivo, debe verse así:

     
  • ¿Ves cómo le digo a la plantilla que use el prefijo MEDIA_URL? Eso finalmente se traduce en 'http://some-good-URL/galleries/https://stackoverflow.com/questions/2451352/cant-figure-out-serving-static-images-in-django-dev-environment/160.jpg' .

    Tenga en cuenta que para poder utilizar realmente MEDIA_URL en sus plantillas, tendrá que agregar la 'django.core.context_processors.media' la línea 'django.core.context_processors.media' a su TEMPLATE_CONTEXT_PROCESSORS en su archivo settings.py, si no me equivoco .

    Haz que tu servidor dev sirva archivos estáticos

    En un entorno real, configurará archivos con direcciones como “static_media” para que se sirvan sin pasar por Django. Pero en un entorno de desarrollo, también querrás servirlos desde Django, así que debes agregar esta línea genérica al final de tu archivo urls.py:

     if settings.DEBUG: # Serve static files in debug. urlpatterns += patterns('', (r'^site_media/(?P.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT, 'show_indexes' : True}), ) 

    Observe cómo eso lleva cualquier cosa con la url “site_media / *” (que en realidad es mi MEDIA_URL) y lo sirve desde mi carpeta MEDIA_ROOT, que es el lugar donde la configuración MEDIA_ROOT entra en juego.

    Nota final

    Lo que me confundió es que muchas de las cosas aquí son por conveniencia. Por ejemplo, MEDIA_ROOT solo se usa en su patrón de url de depuración, para decirle a Django de dónde cargar. Y MEDIA_URL solo está ahí para alentarlo a que no coloque URL absolutas en todos sus archivos HTML, ya que cuando decide mover los archivos a un servidor diferente, tendrá que cambiarlos todos manualmente (en lugar de simplemente cambiar MEDIA_URL). constante).

    Por supuesto, nada de esto es necesario: puede codificar el patrón de url de depuración con su propia carpeta, asegurarse de que los archivos estáticos se estén procesando desde la url (visitándolos en su navegador) y luego codificarlos manualmente. eso sin usar la configuración MEDIA_URL en el archivo HTML, solo para asegurarse de que las cosas funcionen.

    Esto se ve buggy …:

     r'^galleries/(landscapes)/(?P.jpg)$' 

    este RE solo hará coincidir los nombres de las imágenes con un solo carácter para el sufijo jpg , no cuatro (como en, por ejemplo, 'http://sofes.miximages.com/image/160.jpg' ). Tal vez quisiste decir …

     r'^galleries/(landscapes)/(?P.*jpg)$' 

    …?

    Toma esto como un cruce entre las dos respuestas anteriores, las cuales son buenas. Primero, tu expresión regular es incorrecta como lo señaló Alex. Sugeriría configurarlo como:

      (r'^local_media/(?P.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}), # static content 

    Debido a que probablemente también querrá servir los archivos css y js, no solo las imágenes. Esta expresión regular se ocupa de todos y cada uno de los archivos estáticos que desee servir.

    A continuación, deseará especificar el MEDIA_URL para sus tags img. Tu Actualmente tienes:

      

    En su lugar, tiene que ser algo como:

      

    El truco que utilizo es fácil. En la parte superior de mi views.py , tengo el siguiente código:

     from django.conf import settings resp = {} resp['MEDIA_URL'] = settings.MEDIA_URL 

    y luego simplemente paso el diccionario de respuesta a cada plantilla que represento. Ahora puedo escribir esas mismas tags img como:

      

    Lo mejor de todo es que esta parte de su código también se puede usar en producción (no las expresiones regulares, solo el bit MEDIA_URL).