2010-12-31 13 views
0

ich meine Bilder in der DB als Blobs:vorbei Blob-Parameter auf django

class MyClass(db.Model): 
    icon=db.BlobProperty() 

Nun mag ich wie folgt aus der Blob zu meinem HTML senden: kann sagen, ich habe myClass als Instanz von MyClass

result = """<div img_attr=%s> Bla Bla </div>""" % (myClass.icon) 

Einige, wie es nicht funktioniert. Hast du irgendeine Idee?

Antwort

0

Ihr Code besagt, dass Sie mit Django an der Google-Anwendungs-Engine arbeiten.

Sie müssen nur das Bild in Ihrer Sicht abfragen und es als HTTP-Antwort zurückgeben.

image = myclassObject.icon

response = Httpresponse (Bild)

response [ 'Content-Type'] = 'image/jpg'

return response

1

Sie können nicht nur rohe Bilddaten in Ihre HTML-Seite ausgeben. Sie müssen dies in zwei Stücke tun:

in Ihrem HTML-, müssen Sie auf eine Bilddatei verweisen:

result = "<div>" 
     "<img src='{0}' />" 
     "</div>" 
     .format(MYSITE + MYIMAGEDIR + myClass.name) 

Ihr Browser liest die HTML-Seite, findet heraus, Sie ein Bild aufnehmen möchten und geht für die image-Datei einbezogen suchen - so fragt er Ihre Website für so etwas wie http://www.myexample.com/images/icon01.jpg

nun separat, Sie zu dieser zweiten Anforderung mit dem Bildinhalt reagieren, wie @anand gezeigt hat.

+0

wie der Code vorschlagen, ist es auf Google Application Engine und das Schreiben von Dateien ist nicht erlaubt. Sie müssen Ihre Dateien im Blob Store selbst speichern. –

+0

@anand: oh! mein Fehler. –

0

Der Wert, der im Datenspeicher gespeichert und von appengine mit einer db.BlobProperty zurückgegeben wird, entspricht nicht den tatsächlichen Bytes des Blobs, sondern einem BlobKey, der für die Referenz verwendet wird. Es gibt zwei Möglichkeiten, wie Sie diesen Schlüssel verwenden können. Sie können einen BlobReader erstellen, um die Bytes des Blobs aus dem BlobStore in Ihre App zu laden, oder Sie können eine Antwort mit ServeHandler.send_blob erstellen, um diese Bytes an den Client zu übertragen.

Das zweite in Django zu tun ist ein bisschen Kopfschmerzen, weil ServeHandler nicht wirklich gut mit dem Django Request Processing Stack passt. Hier ist eine Ansicht, die es für Sie ohne zu viele Probleme tun wird:

def get_image_data(request, key, filename): 
    "serve original uploaded image" 

    # verify the users' ability to get the requested image 
    key = urllib.unquote(key) 
    img = _load_metadata(request, key) 
    blob = img.data; 
    blobkey = blob.key() 

    # and tell google to serve it 
    response = http.HttpResponse(
     content='', 
     content_type=blob.content_type) 
    response['X-AppEngine-BlobKey'] = str(blobkey) 
    return response 
+0

Falsch. Eine 'db.BlobProperty' speichert Blobdaten, die in der Datenspeicherentität gespeichert sind. Sie denken an 'blobstore.BlobReferenceProperty'. –