Guardar y recuperar imagen desde Postgres

Alberto Valverde alberto en toscat.net
Jue Ene 31 23:03:40 CET 2008


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





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