2

我正在尝试使用图像 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 处理程序中复制带有图像标签的行

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()我要显示的图像的关键是?

4

1 回答 1

3
  1. "img_id"来自 url 的 GET 部分(类似于“www.example.com/img?img_id=12312 )。引擎为数据库中的每个模型分配一个新的唯一键。

  2. greeting.avatar是带有 key 的模型的头像属性img_id。所以,在某种意义上,你可以把它想象成img_id.avatar,尽管从技术上讲它是不正确的。

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

编辑: result.key()是数据库自动为您的模型提供的唯一标识符。您需要将其“告诉”您刚刚编写的图像处理程序,以便它知道您需要哪个特定模型头像。您可以通过img_id为 url 设置 GET 变量来做到这一点(您刚刚做了)。

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

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

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

于 2010-12-03T22:02:27.577 回答