2010-12-03 20 views
2

J'essaie de comprendre la documentation Using the Images Python API et je suis confus sur la façon d'obtenir la clé et afficher l'avatar.Comment afficher une image de blobstore?

La documentation indique que le gestionnaire Image servira l'image du chemin /img. Je ne comprends pas ce que fait ce gestionnaire Image. Je commente ci-dessous comment le comprendre; Corrigez s'il vous plaît. Merci:

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) 

Un grand merci pour votre aide.


MISE À JOUR (re: réponse par Gabi Purcaru)

Merci encore pour la réponse claire. J'ai une requête qui affiche les commentaires des utilisateurs comme celui-ci:

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>") 

, je copier la ligne avec l'étiquette d'image du MainPage handler

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

et changer

greeting.key() 

à

result.key() 

Je suppose que, cela devrait maintenant afficher l'avatar à côté du commentaire utilisateur:

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>") 

mais toujours pas clair pourquoi result.key() est la clé de l'image que je veux montrer?

+0

La valeur de img_id est la clé du magasin de données qui spécifie l'emplacement précis de l'objet Image spécifique dans la banque de données. http://code.google.com/appengine/docs/python/datastore/keyclass.html Effectuer un get à l'aide de cette touche récupérera le message d'accueil s'il existe. – kevpie

+0

@kevpie: merci. Comment le moteur de l'application sait-il quel 'img_id' obtenir dans cette ligne' salut = db.get (self.request.get ("img_id")) '? – Zeynel

+0

Ce n'est pas blobstore. Ceci est un blob dans le magasin de données. Vous devez lire attentivement les documents sur Blobstore. Vous confondez les deux concepts dont j'ai peur. – DocWiki

Répondre

3
  1. "img_id" vient de la partie GET de l'URL (quelque chose comme "www.example.com/img? img_id = 12312"). Le moteur attribue une nouvelle clé unique à chaque modèle de la base de données.

  2. greeting.avatar est la propriété avatar du modèle avec la clé img_id. Donc, dans un certain sens, vous pouvez y penser comme img_id.avatar, bien que techniquement ce n'est pas correct.

  3. qui n'affiche pas l'avatar, il ne fait que retourner l'avatar. Prenons une image habituelle par exemple pour que vous compreniez mieux. Lorsque vous écrivez <img src="some_link" />, le navigateur recherchera "some_link" et inclura cette image. Le navigateur lira alors l'image du système de fichiers et la renverra au navigateur. Ce que votre gestionnaire fait est de changer la partie backend, de sorte que le serveur Web renvoie l'image du magasin de données (spécifiquement cette propriété avatar) au lieu d'un fichier normal. Le navigateur - et l'utilisateur - le verra comme une image régulière.

EDIT: result.key() est l'identifiant unique que la base de données a automatiquement votre modèle. Vous devez le "dire" au gestionnaire d'image que vous venez d'écrire, pour qu'il sache quel avatar vous avez besoin.Vous le faites en définissant la variable GET img_id pour l'URL (que vous venez de faire).

Je ne suis pas sûr si vous comprenez la chose entière .key(). Permettez-moi d'expliquer que:

Toute base de données doit identifier un enregistrement d'un autre (modèle dans notre cas). C'est pourquoi ils automatiquement attribuer un nouvel identifiant, et le plus important unique (clé dans notre cas) à chaque enregistrement inséré dans la base de données. Vous devrez fournir la clé du modèle pour que votre gestionnaire renvoie l'avatar de ce modèle. Prenons un exemple du monde réel: vous êtes un individu parmi d'autres. La façon dont votre pays vous identifie de manière unique est par une sorte de numéro de sécurité sociale (SSN). Dans mon pays, il s'agit d'un code à 13 chiffres (par exemple 1024582485008). Si je veux obtenir mon permis de conduire, je devrai fournir mon nom, mais ce n'est pas suffisant - je ne suis pas le seul Gabi Purcaru dans mon pays. Je vais aussi devoir fournir mon SSN, qui dira exactement qui je suis. Si nous faisons une analogie, vous devez fournir le "SSN" du modèle (c'est-à-dire la clé) au gestionnaire, afin qu'il sache quel modèle pour obtenir de la base de données et retourner son avatar.

+0

Merci pour votre réponse. Cela clarifie beaucoup; mais je ne suis toujours pas clair comment 'db.get (self.request.get (" img_id ")' obtient le 'img_id' pour l'avatar que nous voulons obtenir Je ne vois aucune instruction ici disant" get the 'img_id "associé à un avatar associé à un certain utilisateur." Merci encore – Zeynel

+0

J'ai ajouté une mise à jour .S'il vous plaît laissez-moi savoir ce que vous pensez.Merci – Zeynel

+0

@Zeynel, les résultats sont à partir d'une requête pour les entités dans le magasin de données.Ils clé pour chaque Lorsque le navigateur essaie de charger img src, il frappe le gestionnaire Image avec la clé, la clé est utilisée dans le fichier db.get, puis les octets de la propriété blob sont renvoyés. – kevpie