Guardar y recuperar imagen desde Postgres

Marcos Alcazar marcos.alcazar en gmail.com
Mie Ene 30 19:36:26 CET 2008


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

Saludos, Marcos Alcazar

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

>
> > Gracias Alberto, eso es bueno, muy bueno... Tal vez tengas idea de como
> > hacer lo mismo sin atarme a ningun framework web? Podria ser que mi
> > controlador extienda de alguna clase como por ejemplo la
> > BaseHTTPRequestHandler o alguna de BaseHTTPServer, por decir algo. En
> > realidad no conozco mucho, pero cuento con la ayuda de un gran compañero
> > de
> > trabajo que me guia de a poco.
>
> En mi opinión trabajar directamente con BaseHTTPServer es demasiado bajo
> nivel, no le veo mucha utilidad a menos que lo que te interese sea
> aprender sobre el protocolo HTTP en sí.
>
> Sin salirte de la librería estándar, si usas python 2.5, podrías escribir
> la aplciación siguiendo el protocol WSGI (google te puede dar toda la
> información que desses) con la ventaja de que ésta la podrás servir con
> cualquier servidor que soporte en estándar (mod_wsgi para apache,
> cherrypy, etc...) o con multitud de adaptadores para fast_cgi, e incluso
> cgi. Lo mismo que he escrito "en WSGI" sería algo así:
>
> from wsgiref.simple_server import make_server
>
> def application(environ, start_response):
>    obj = session.query(ObjetoGrande).get(id_imagen)
>    start_resonse("200 OK", [('Content-Type', 'image/jpeg')])
>    return [obj.data]
>
> if __name__ == '__main__':
>    server = make_server('', 8000, application)
>    server.serve_forever()
>
> >
> > Tal vez vos o alguien podria podria recomendarme alguno de esos
> frameworks
> > que nombras? Ventajas y desventajas? Me conviene jugarme por uno y
> > depender
> > directamente de alguno de ellos, o sera mejor seguir desarrollando sin
> > jugarme por alguno?
>
> Te conviene jugarte por uno, WSGI/HTTP "a pelo" es para masoquistas ;)
> WSGI no es un API para hacer aplicaciones web, más bien un interfaz para
> que frameworks se cominiquen con un servidor web. Si sigues ésta ruta al
> menos utiliza alguna librería como WebOb para hacer WSGI  más amigable.
> Por ejemplo, en http://pylonshq.com/pasties/575 tienes una "receta" de
> como te podrías montar tu propio framework con Web y Routes (para resolver
> urls). La receta usa el servidor WSGI de CherryPy pero facilmente lo
> puedes susitituir por el de la librería estandar (en wsgiref)
>
> La ventaja de un framework es que el hacer una aplicación web es un camino
> muy trillado y hay mucho escrito para resolver problemas comunes
> (sesiones, concurrencia, acceso a BDD, plantillas HTML, autentificación) y
> te permite concentrarte en el problema que la aplicación debe resolver.
>
> Si vas a usar SQLAlchemy y eres novatillo te recomiendo Turbogears (ojo,
> soy uno de los desarrolladores) porque es más bastante sencilla de
> utilizar y está bien integrado con SA. Si ya tienes experiencia te
> recomiendo Pylons ya que es la más flexible a la hora de adaptarla a lo
> que vayas a usar. Si no estás muy ligado a SQLAlchemy también te puede
> interesar Django que tiene muy buena documentación y es la que más
> usuarios tiene (es decir, ayuda a puñados varias listas de correo, foros y
> en varios idiomas).
>
> Yo personalmente uso Pylons, SQLAlchemy y Mako o Genshi para plantillas.
>
> Alberto
>
> _______________________________________________
> 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