Como mostrar imagen en browser alojada en db

262 views
Skip to first unread message

Antony Petrocelli

unread,
Oct 2, 2013, 8:11:31 PM10/2/13
to djan...@googlegroups.com
Que tal Grupo, alguien sabe como enviar a el navegador una imagen que esta en alojada en una base de datos. Cuando se guardo la imagen no se especifica una url o path porque va es a la db, ahi mi problema. Verifique que la imagen se almacena, pero como hago para mostrarla si no tiene una ruta asociada. No lo he probado, pero pensé en llamar a la imagen y guardarla temporalmente  en un directorio y con ese path y nombre llamarla desde la plantilla.

Gracias de antemano.

--
Antony Petrocelli
Tlf: 04163946584
Linux User: 516830
El Tigre, Edo. Anzoátegui

Hiko hitokiri

unread,
Oct 2, 2013, 9:48:28 PM10/2/13
to djan...@googlegroups.com
para empezar es una de las peores ideas meter imágenes en la db. primero por que la hacen crecer mucho y segundo por que sobrecargas el server para sacarla 

Antony Petrocelli

unread,
Oct 2, 2013, 10:24:36 PM10/2/13
to djan...@googlegroups.com
Epale Hiko, gracias por responder, para hacer un perfil creo que no recargara el server, no hecho pruebas, no tengo estadísticas ni la experiencia. Solo aprovecho la facilidad que me brinda mongodb para almacenar imagenes y la ventaja de tener todo en un solo sitio. Estoy claro que no todo debe almacenarse en las bases de datos, no soy experto en este tema, he leído mucho y unos y otros apoyan su elección y argumentan el porque, cada una tiene sus pros y contra y dependerá del escenario cual elegir. Por ahora, solo deseo guardar la imagen del perfil.

Lo que tengo hasta ahora es un objeto de tipo ImageField que posee una imagen pero no se como mostrarla en el navegador si no la tengo en un path?


El 2 de octubre de 2013 21:18, Hiko hitokiri <las...@gmail.com> escribió:
para empezar es una de las peores ideas meter imágenes en la db. primero por que la hacen crecer mucho y segundo por que sobrecargas el server para sacarla 

--
--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.
---
Has recibido este mensaje porque estás suscrito al grupo "Django-es" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a django-es+...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.

carlos

unread,
Oct 3, 2013, 1:10:38 AM10/3/13
to djan...@googlegroups.com
Hola bueno segun tengo entendido mongodb utiliza gridFS para guardar objetos tipos archivos
ademas debes utilizar pymongo ya que por si el ORM actual de django no soporta bd no relacionales

saludos


2013/10/2 Antony Petrocelli <petro...@gmail.com>

Javier Ramirez

unread,
Oct 3, 2013, 5:19:10 AM10/3/13
to djan...@googlegroups.com

Si no me equivoco Imagefield sólo te guarda el enlace no la imagen en si le has puesto en donde están las imágenes en el settings?

Desde el móvil disculpe las molestias

Antony Petrocelli

unread,
Oct 3, 2013, 11:12:11 PM10/3/13
to djan...@googlegroups.com
Las sub clases ImageField y FileField de mongoengine no permiten especificar una ruta como alternativa para que se guarden las imagenes en un directorio, pero ese no es el problema, la imagen se esta guardando, lo que no no se es como mostrarla en el navegardor ya que no dispongo de una ruta, la unica forma que visualizar la imagen desde el navegador es que este el direcotorio de medios o en una url.
Antony Petrocelli
Linux User: 516830
Activista del Software Libre

Ramiro Morales

unread,
Oct 4, 2013, 6:38:15 AM10/4/13
to djan...@googlegroups.com
Lo que podes hacer es lo sig.:

1. Diseñar un esquema de urls para esas imágenes. Supongo que con
alguna correlación entre las primeras y los ids de las segundas. El
resultado de este diseño serán una u más entradas en el urlconf de tu
app o proyecto Django.

2. Revisar si el adaptador Python para mongo tiene alguna función por
la cual obtener el MIME type de cada imagen. Si no, tendrás q
implementar alguna detección en tu código.

3. Similar a 2 pero lo que se necesita en este caso es una función que
permita extraer el contenido de dichas imágenes, en lo posible usando
una interfaz que en Python recibe el nombre de "file-like". O sea que
retorne un objeto que acepte leer su contenido de forma secuencial y
gradual con read(). Esto es importante porque permitiría que el
proceso de servido de esas imágenes no implique tener todo su
contenido en memoria sino ir leyendo a medida que se va enviando al
browser ("streaming"). Si esto no es posible no te va a quedar otra
opción que cargar todo el contenido a memoria o bajarlo a disco y
servirlo desde allí. En la documentación de Django hay un ejemplo de
técnicas similares a esta problemática en la sección de cómo servir
PDFs generados dinámicamente con ReportLab.

4. Crear una view Django a la que apuntarán la o las urls de 1 y que
usando la información de 2 y 3 pueda identificar el registro Mongo de
la image solicitada desde el browser y retornar el mime type + el
contenido en una HttpResponse o una StreamingHttpResponse Django.

En general es desafortunado que el contenido de las imagenes tengan
que pasar por el stack Python/Django en su camino entre la DB y el
webserver/browser ya que Django aporta poco valor en esta tarea y
estás sobrecargando tu hardware de servidor de aplicaciones.

Es por eso que en escenarios mas 'tradiconales' lo que se implementa
es que aun cuando datos como el path de las imágenes están en la DB,
su contenido puede ser servido desde los archivos del FS con APIs Unix
muy eficientes de streaming disco->red como sendfile() y de esa manera
ese flujo de inormación nunca pasa por el proceso Python que sirve el
contenido dinámico con Django. Incluso se puede delegar la tarea a
servidores dedicados a eso.

--

Ramiro Morales
@ramiromorales

Antony Petrocelli

unread,
Oct 5, 2013, 3:09:50 PM10/5/13
to djan...@googlegroups.com
Gracias por responder Ramiro, ya resolví y lo hice creando una vista que solo sirva la imagen, con el user del request busco la imagen en el documento de perfil, envio su contenido con HttpResponse especificando el mimetype; definí la url correspondiente y en la plantilla hice la llamada a la vista desde la etiqueta <img>, con eso resolví. 

Ahora veré como hago para recuperar una diccionario con imágenes y procesarlo con javascript que me permita hacer  una galería, o mostrar las imágenes de un producto que se este vendiendo.

Samir Hinojosa

unread,
May 23, 2014, 12:44:52 PM5/23/14
to djan...@googlegroups.com
Hola Antony,

Estoy iniciando con Django, MongoDB a través de Mongoengine. Actualmente guardo y consulto un archivo registrado en MongoDB mediante su ObjectID y lo dscargo. Estoy tratando de poder almacenar un archivo (en este caso imagen) y poder consultarlo/retonarlo con un dictionario de datos (similar a lo que comentas en tu solución) y en este punto no he podido avanzar.  Me preguntaba si pudiste hacerlo y cómo?

Desde ya, muchas gracias!

Antony Petrocelli

unread,
May 24, 2014, 12:52:10 AM5/24/14
to djan...@googlegroups.com
Que tal Samir, este es mi codigo:

Vista:
def get_image(request):
if request.user.is_authenticated:
profile = userProfile.objects(user=request.user).first()
if profile:
print "retorno imagen perfil"
return HttpResponse(profile.photo.read(),mimetype=profile.photo.content_type)


template:

{% if profile.photo%}
<p>Aqui va mi foto </p>
<img src='/imagen_perfil/' />
{% endif%}


url:

url(r'^imagen_perfil/$','get_image',name='imagen_perfil'),


Espero te sirva de guía.



--
--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.
---
Has recibido este mensaje porque estás suscrito al grupo "Django-es" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a django-es+...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages