【问题标题】:How to display an image from blobstore?如何显示来自 blobstore 的图像?
【发布时间】:2010-12-03 21:53:10
【问题描述】:

我正在尝试理解文档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 的回答)

再次感谢您的明确答复。我有一个查询显示这样的用户 cmets:

    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()是我要显示的图片的key?

【问题讨论】:

  • img_id 的值是数据存储键,指定特定 Image 对象在数据存储中的精确位置。 code.google.com/appengine/docs/python/datastore/keyclass.html 使用此键执行 get 将检索问候语(如果存在)。
  • @kevpie:谢谢。应用引擎如何知道img_id 进入这一行greeting = db.get(self.request.get("img_id"))
  • 这不是 blobstore。这是数据存储中的一个 blob。您需要非常仔细地阅读有关 Blobstore 的文档。恐怕你混淆了这两个概念。

标签: python google-app-engine blobstore


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

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

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

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

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

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

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

【讨论】:

  • 感谢您的回答。这澄清了很多;但我仍然不清楚db.get(self.request.get("img_id") 是如何获得我们想要获得的头像的img_id 的。我在这里没有看到任何说明“获取与某个用户关联的头像关联的img_id”。再次感谢。
  • 我添加了更新。请让我知道你的想法。谢谢。
  • @Zeynel,结果来自对数据存储区中实体的查询。它们对每个实体的密钥作为 html 中的 img src url 发出。当浏览器尝试加载该 img src 时,它会使用密钥访问 Image 处理程序。密钥在 db.get 中使用,然后在 contentType 标头之后返回来自 blob 属性的字节。这有帮助吗?
  • @kevpie:但是我不明白的是,查询结果返回的实体不是图片;或result.avatar。但无论如何;处理程序 AvatarSave 没有将图像写入 blobstore。你有什么建议吗?谢谢。
  • @Zeynel,这没有使用 blobstore。这是数据存储中模棱两可的事情之一。 blob 属性不是 blobstore 对象。此示例仅使用普通的 blob 属性。如果您想利用 picasa 图像服务基础架构或存储大型二进制对象,您将需要参考 blobstore 示例以及 get_serving_url 之类的内容。 Blobstore 不是数据存储 BlobProperty。
猜你喜欢
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
  • 2013-06-12
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多