2010-12-03 16 views
2

Ich versuche, die Dokumentation zu verstehen Using the Images Python API und ich bin verwirrt darüber, wie man den Schlüssel und den Avatar anzeigen.Wie man ein Bild von blobstore anzeigt?

Die Dokumentation besagt, dass der Handler Image das Bild aus dem Pfad /img liefert.

Ich bin verwirrt darüber, was dieser Image Handler tut. Ich kommentiere unten, wie man es versteht; bitte korrigieren. Danke:

class Image (webapp.RequestHandler): 
    def get(self): 
     #get the key of the image "img_id" from datastore 
     #what is the value of "img_id"? Where does it come from? 
     #how does the app engine know to get what key for which image? 
     greeting = db.get(self.request.get("img_id")) 
     #what is greeting.avatar? 
     #is it img_id.avatar ? 
     #I assume "avatar" refers to the "avatar" property in the model 
     if greeting.avatar: 
      self.response.headers['Content-Type'] = "image/png" 
      #does this display the avatar? 
      #I thought the img tag displayed the avatar 
      self.response.out.write(greeting.avatar) 
     else: 
      self.error(404) 

Vielen Dank für Ihre Hilfe.


UPDATE (re: Antwort von Gabi Purcaru)

Nochmals vielen Dank für die klare Antwort. Ich habe eine Abfrage, die die Benutzer Kommentare wie dieser zeigt:

for result in results: 
     self.response.out.write("<li>") 
     self.response.out.write("<b>%s</b> %s " % (result.userName, result.userLatestComment)) 
     self.response.out.write("</li>") 
    self.response.out.write("</ol></body></html>") 

so, kopiere ich die Zeile mit dem Image-Tag aus dem MainPage handler

self.response.out.write("<div><img src='img?img_id=%s'></img>" % greeting.key()) 

und ändern

greeting.key() 

zu

result.key() 

Ich gehe davon aus, dass dies jetzt den Avatar neben den Benutzer Kommentar anzeigen soll:

for result in results: 
     self.response.out.write("<li>") 
     self.response.out.write("<b>%s</b> %s " % (result.userName, result.userLatestComment)) 
     self.response.out.write("<div><img src='img?img_id=%s'></img>" % result.key()) 
     self.response.out.write("</li>") 
    self.response.out.write("</ol></body></html>") 

aber immer noch nicht klar, warum result.key() ist der Schlüssel des Bildes I angezeigt werden soll?

+0

Der Wert von img_id ist der Datenspeicherschlüssel, der den genauen Speicherort des bestimmten Image-Objekts im Datenspeicher angibt. http://code.google.com/appengine/docs/python/datastore/keyclass.html Wenn Sie einen get mit diesem Schlüssel ausführen, wird die Begrüßung abgerufen, sofern sie vorhanden ist. – kevpie

+0

@kevpie: danke. Wie weiß die App-Engine, welche 'img_id' in diese Zeile gelangt? Gruß = db.get (self.request.get (" img_id "))'? – Zeynel

+0

Dies ist kein Blobstore. Dies ist ein Blob im Datenspeicher. Sie müssen die Dokumentation über Blobstore wirklich sorgfältig lesen. Du verwirrst die beiden Konzepte, fürchte ich. – DocWiki

Antwort

3
  1. "img_id" aus dem GET Teil der URL (so etwas wie "www.example.com/img? img_id = 12312") kommt. Die Engine weist jedem Modell in der Datenbank einen neuen eindeutigen Schlüssel zu.

  2. greeting.avatar ist die Avatar-Eigenschaft des Modells mit dem Schlüssel img_id. In gewisser Weise kann man sich das wie img_id.avatar vorstellen, obwohl es technisch nicht korrekt ist.

  3. das den Avatar nicht anzeigt, es gibt nur den Avatar zurück. Nehmen wir zum Beispiel ein normales Bild, damit Sie es besser verstehen. Wenn Sie <img src="some_link" /> schreiben, sucht der Browser nach "some_link" und fügt dieses Bild ein. Der Browser liest dann das Bild vom Dateisystem und gibt es an den Browser zurück. Was Ihr Handler macht, ist das Ändern des Backend-Teils, so dass der Webserver das Bild aus dem Datenspeicher (speziell die Eigenschaft avatar) anstelle einer normalen Datei zurückgibt. Der Browser - und der Benutzer - sehen es als normales Bild.

EDIT: result.key() ist die eindeutige Kennung, die die Datenbank automatisch Ihr Modell gab. Sie müssen dem gerade beschriebenen Bild-Handler "sagen", um zu wissen, welches bestimmte Modell-Avatar Sie benötigen.Sie tun das, indem Sie die Variable img_id GET für die URL setzen (was Sie gerade getan haben).

Ich bin mir nicht sicher, ob Sie die ganze .key() Sache verstehen. Lassen Sie mich das erklären:

Jede Datenbank muss einen Datensatz von einem anderen (Modell in unserem Fall) identifizieren. Dies ist, warum sie automatisch zuweisen eine neue und vor allem eindeutige Kennung (Schlüssel in unserem Fall) zu jedem Eintrag in der Datenbank eingefügt. Sie müssen den Modellschlüssel für Ihren Handler angeben, um den Avatar dieses Modells zurückzugeben.

Nehmen wir ein Beispiel aus der Praxis: Sie sind ein Individuum unter vielen. Die Art und Weise, wie Ihr Land Sie eindeutig identifiziert, ist durch eine Art SSN (Sozialversicherungsnummer). In meinem Land ist es ein 13-stelliger Code (z. B. 1024582485008). Wenn ich meinen Führerschein bekommen will, muss ich meinen Namen nennen, aber das ist nicht genug - ich bin nicht die einzige Gabi Purcaru in meinem Land. Ich werde auch meine SSN zur Verfügung stellen müssen, die genau wer ich bin. Wenn wir eine Analogie machen, müssen Sie dem Handler die "SSN" (d. H. Schlüssel) des Modells bereitstellen, so dass es wissen wird, welches Modell aus der Datenbank erhalten und seinen Avatar zurückgeben kann.

+0

Danke für Ihre Antwort. Das verdeutlicht viel; aber ich bin immer noch nicht klar, wie 'db.get (self.request.get (" img_id ")' die 'img_id' für den Avatar bekommt, den wir bekommen wollen. Ich sehe keine Anweisung hier, die sagt" hol die 'img_id "Vielen Dank. – Zeynel

+0

Ich habe ein Update hinzugefügt. Bitte lassen Sie mich wissen, was Sie denken. Danke. – Zeynel

+0

@Zeynel, ergibt sich aus einer Abfrage für die Entitäten im Datenspeicher. Sie Schlüssel für jeden." Wenn der Browser versucht, diesen img src zu laden, trifft er den Image-Handler mit dem Schlüssel.Der Schlüssel wird in der Datei db.get verwendet und dann werden die Bytes aus der Eigenschaft blob zurückgegeben Nach dem contentType-Header: Ist das hilfreich? – kevpie

Verwandte Themen