Guardar y recuperar imagen desde Postgres

Marcos Alcazar marcos.alcazar en gmail.com
Vie Feb 1 12:05:03 CET 2008


Hola Alberto...

En mis aplicaciones reales, tengo un Asistente, o como quieras llamarle, que
es un singleton, para que el se ocupe de la tarea de mapeos y de crear mi
engine y mi Session, no te hagas problema, a mi me gustan las cosas lindas
lindas... ;) . Esto es solo parte de unas pruebillas que estoy haciendo para
tratar de mostrar una imagen. Si alguna vez anda(espero que si), lo incluire
en mi aplicacion, tambien de alguna manera bien linda.

De eso no viene mi problema, estoy bastante seguro de eso. Y si, si puedo
ver el contenido de "data". Antes de guardarlo en la base y despues de
recuperarlo tambien.
Y no tengo ningun error, hace exactamente lo que le pido, wr(data) me
escribe en la pagina los bytes de "data", pero como texto, o sea, el
setHeader("Content-Type", "image/jpg") no lo hago bien, o no va ahi, o me
faltan cosas por hacer. Creo que en esto radica mi problema.

Es verdad que faltan tutoriales de todo tipo en castellano, aunque cada vez
hay mas. O cada vez me acostumbro mas a leer cosas en ingles? No se bien...
Estaria bueno lo del tuto de SQLAlchemy en castellano, eso ayudaria a
bastante gente... Yo me guie con la documentacion y me ha ido bien, por
ahora.

Saludos, Marcos

2008/1/31 Alberto Valverde <alberto en toscat.net>:

> Marcos Alcazar wrote:
> > Aqui de nuevo, reviviendo un thread antiguo...
> >
> > Ya me di cuenta lo que quiero hacer, asiq es mucho mas facil que ustedes
> me
> > ayuden :-)
> >
> > En realidad, estoy usando WebKit, y mi controlador hereda de Page (que
> forma
> > parte de  Webkit.Page), por lo que puedo hacer lo siguiente... Les
> recuerdo
> > que utilizo SQLAlchemy y Postgres
> >
> > #En Primer Lugar, realizo un upload de la imagen hacia mi servidor, la
> > recupero y la guardo en la base
> > file = self.request().field('archivo')
> > obj.nombre = file.filename
> > obj.data = file.value
> > session.save(obj)
> > session.commit()
> >
> > #Aca recupero la imagen que en algun momento he guardado
> > def recuperoImagen(self):
> >         clear_mappers()
> >         metadata = MetaData()
> >
> >         objetoGrande = Table('objeto_grande' , metadata ,
> >                              Column('id' , Integer , primary_key=True),
> >                              Column('nombre' , String() ,
> nullable=False),
> >                              Column('data' , BLOB , nullable=False)
> >                              )
> >         mapper(ObjetoGrande,objetoGrande)
> >
> >         engine =
> > create_engine('postgres://postgres:postgres@localhost:5432/marcos'
> > )
> >         Session = sessionmaker(bind=engine, autoflush=True,
> > transactional=True )
> >         session = Session()
> >
> >         obj = session.query(ObjetoGrande).first()
> >
> >         return obj.data
> >
> > #Y despues, lo que yo creo que deberia hacer, pero creo mal porque no
> > funciona es sobrescribir el metodo de la clase Page:
> > def writeContent(self):
> >         data = self.recuperoImagen()
> >         res = self.response()
> >         wr = self.writeln
> >         res.setHeader("Content-Type", "image/jpg")
> >         res.setHeader("Content-Length", str(len(data)))
> >         wr(data)
> >         res.flush()
> >
> > De esta manera puedo llamar a writeContent y "escribir" en mi pagina los
> > bytes de la imagen. En teoria, seteandole el header como "image/jpg",
> > deberia ver esos bytes como una imagen?
> > Estoy seguro que faltan cosas, pero he buscado bastante ya,  y no puedo
> > encontrar la solucion...
> >
> > Bueno... si alguien puede, lo agradezco, sino, y bue....
>
> ¿Qué error te da? ¿Puedes ver cual es el valor de data antes de
> escribirlo en la respuesta?
>
> Por cierto, eso que haces dentro de recuperoImagen() al instanciar
> MetaData, la tabla y el sessionmaker pinta muy feo... eso sólo lo debes
> hacer una vez al iniciar la aplicación, normalmente al importar un
> módulo. SQLAlchemy hace algunas cosillas mágicas con las clases cuando
> las mapea y eso de mapearlas y desmapearlas en cada petición no es bueno.
>
> Basicamente el proceso es algo así:
>
> 1) crea un módulo para el modelo:
>
> meta = Metadata()
>
> tabla1 = Table("tabla1", meta, col1, col2, ...)
>
> class ClaseMapeada1(object):
>    ....
>
> mapper(ClaseMapeada1, tabla1, ...)
>
> engine = create_engine(
>    'postgres://postgres:postgres@localhost:5432/marcos')
>
> Session = sessionmaker(bind=engine, autoflush=True, ...)
>
> Todo ésto debe estar a nivel de módulo para que cuando se importe se
> ejecute (bueno, miento, se puede hacer de otras maneras, pero hazme
> caso... ;)
>
> 2) Ahora, en cada petición:
>
> def atiendePeticion():
>    session = Session()
>    obj = session.query(ClaseMapeada).blablabla(...)
>    ...
>
> Bueno, no sé si ésto arreglará tu problema, quien sabe, tal vez... ;)
>
> Alberto
>
> P.D. La verdad es que no he visto ningún tutorial de SA en español, es
> una verdadera pena ya que SA es impresionante... ¿alguien se anima?
>
> _______________________________________________
> Lista de correo Python-es
> http://listas.aditel.org/listinfo/python-es
> FAQ: http://listas.aditel.org/faqpyes
>
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es