bild ohne zwischenspeichern an den cherrypy schicken ?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
nuss
User
Beiträge: 53
Registriert: Donnerstag 28. August 2008, 11:36

Hi, ich möchte eine bilddatei die nur als Buffer oder string vorliegt, direkt
an cherrypy weitergeben, so dass das Bild unter einem angegebenen
pfad/bildernamen zu finden ist, und z.b. durch ein <img src="img.jpg">
in die Seite eingebunden werden kann.

mein erster gedanke war etwas wie dashier:

Code: Alles auswählen

class Page(object):
    def __init__(self, buffer, name):
        self.buffer = buffer
        exec("self."+name+"="+buffer)
        exec("self."name+".exposed=True")
was aber natürlich leider nicht gehen kann,
weil bildernamen immer eine endung mit .xxx haben
Ich kenn mich mit cherrypy noch nicht wirklich aus,
daher wär es nett, wenn mir jemand einen kleinen Anstoß geben könnte ;)
BlackJack

@nuss: Die Frage kann ich nicht beantworten, aber Dich bitten nicht mit ``exec`` (oder auch `eval`) herum zu spielen, wenn das nicht nötig ist (ungetestet):

Code: Alles auswählen

class Page(object): 
    def __init__(self, buffer_, name): 
        self.buffer_ = buffer_
        setattr(buffer_, 'exposed', True)
        setattr(self, name, buffer_)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

nuss hat geschrieben:Hi, ich möchte eine bilddatei die nur als Buffer oder string vorliegt, direkt an cherrypy weitergeben, so dass das Bild unter einem angegebenen pfad/bildernamen zu finden ist, und z.b. durch ein <img src="img.jpg">
in die Seite eingebunden werden kann.
Hallo nuss!

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import cherrypy
from cStringIO import StringIO


class Root(object):
    
    def __init__(self):
        img_file = file("image.jpg", "rb")
        self.img_stream = StringIO(img_file.read())
        self.img_len = img_file.tell()
        img_file.close()
    
    
    def default(self, *args, **kwargs):
        #path = "/" + "/".join(args)
        path = cherrypy.request.path_info
        if path == "/image.jpg":
            cherrypy.response.headers["Content-Type"] = "image/jpeg"
            cherrypy.response.headers["Content-Length"] = self.img_len
            return self.img_stream.getvalue()
        raise cherrypy.NotFound(path)
    default.exposed = True


def main():
    cherrypy.quickstart(Root())


if __name__ == "__main__":
    main()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

@gerold: Wozu ist das `StringIO` hier notwendig!?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

BlackJack hat geschrieben:@gerold: Wozu ist das `StringIO` hier notwendig!?
Hallo BlackJack!

Nuss schrieb "Hi, ich möchte eine bilddatei die nur als Buffer oder string vorliegt,...".
Deshalb simuliere ich das im Beispiel mit StringIO. Ansonsten gibt es keinen Grund dafür. Vielleicht habe ich es damit etwas übertrieben. Man hätte es auch weglassen können. Siehe: http://paste.pocoo.org/show/108694/

lg
Gerold
:-)

PS: Wenn die Bilder auf der Festplatte liegen, würde man in CherryPy ``tools.staticfile`` verwenden.

.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
nuss
User
Beiträge: 53
Registriert: Donnerstag 28. August 2008, 11:36

@blackjack: ja ich weiß eval ist eval und setattr ist in der tat um einiges
schöner, war mir aber bisher unbekannt. thx ;)

@gerold: vielen lieben Dank, dass ist so ziemlich genau dass, was ich gesucht habe, hatte heute leider noch keine Zeit das auszuprobieren,
werd's mir aber auf jedenfall noch genau angucken :D
Antworten