如何从blobstore显示图像?

时间:2010-12-03 21:53:11

标签: python google-app-engine blobstore

我正在尝试理解文档Using the Images Python API,我对如何获取密钥并显示头像感到困惑。

文档说明Image处理程序将通过/img路径提供图像。

我对这个Image处理程序的作用感到困惑。我在下面评论如何理解它;请改正。感谢:

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)

非常感谢你的帮助。


更新(重新:Gabi Purcaru回答)

再次感谢您的回答。我有一个显示用户评论的查询:

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

所以,我使用MainPage handler

中的图片代码复制该行
self.response.out.write("<div><img src='img?img_id=%s'></img>" % greeting.key())

并更改

greeting.key()

result.key()

我认为,现在应该显示用户评论旁边的头像:

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

但仍然不清楚为什么result.key()是我想要显示的图像的关键?

1 个答案:

答案 0 :(得分:3)

  1. "img_id"来自网址的GET部分(例如“www.example.com/img? img_id = 12312 ”)。引擎为数据库中的每个模型分配一个新的唯一键。

  2. greeting.avatar是具有键img_id的模型的头像属性。因此,在某种意义上,您可以将其视为img_id.avatar,尽管从技术上讲它是不正确的。

  3. 不显示头像,只是返回头像。让我们以通常的图像为例,让您更好地理解。当您编写<img src="some_link" />时,浏览器会查找"some_link",并包含该图片。然后,浏览器将从文件系统中读取图像,并将其返回到浏览器。您的处理程序所做的是更改后端部分,以便Web服务器将从数据存储区(特别是avatar属性)而不是常规文件返回映像。浏览器 - 以及用户 - 将其视为常规图像。

  4. 修改 result.key()是数据库自动为您的模型提供的唯一标识符。你需要“告诉它”你刚才写的图像处理程序,因为它知道你需要哪个特定的模型头像。你可以通过为url设置img_id GET变量(你刚才这样做)。

    我不确定你是否理解整个.key()的事情。让我解释一下:

    任何数据库都需要从另一个记录中识别一条记录(在我们的例子中是模型)。这就是为什么他们将自动为插入数据库的每个记录分配一个新的,最重要的唯一标识符(在我们的例子中为键)。您必须为处理程序提供模型的键才能返回该模型的头像。

    让我们以现实世界为例:你是众多人中的一员。您所在国家/地区唯一标识您的方式是通过某种SSN(社会安全号码)。在我的国家/地区,它是一个13位数的代码(例如1024582485008)。如果我想获得驾照,我将提供我的名字,但这还不够 - 我不是我国唯一的Gabi Purcaru。我还必须提供我的SSN,它将准确地告诉我是谁。如果我们进行类比,你必须向处理程序提供模型的“SSN”(即密钥),以便它知道从数据库中获取哪个模型并返回它的化身。