【问题标题】:Entity images + Blobstore实体图像 + Blobstore
【发布时间】:2014-02-07 11:44:18
【问题描述】:

我很困惑 Blobstore 如何与为每个实体提供图像一起工作。

假设我有:

class Book(ndb.Model):
    title = ndb.StringProperty()
    cover_image = ndb.BlobProperty()

如何在 jinja2 模板中输出此信息,如下所示:

<h1>{{title}}</h1>
{{cover_image}}

我的困惑源于我不清楚 Blobstore 和数据存储如何协同工作。例如:我们如何将数据存储区的实体与 Blobstore 属性相关联(在我们的示例中,它将 cover_image blob 属性与其 Book 实体相关联)?

非常感谢您提供简化的解释。谢谢。

【问题讨论】:

    标签: google-app-engine google-cloud-datastore blobstore app-engine-ndb


    【解决方案1】:

    您可以在模型中使用 BlobKeyProperty 来维护数据存储区和 Blob 存储区之间的引用。例如:

    class MyContent (ndb.Model):
        Image = ndb.BlobKeyProperty()
    

    然后,如果您需要经常获取关联的 URL,您甚至可以存储服务 URL:

    class MyContent (ndb.Model):
        Image = ndb.BlobKeyProperty()
        ImageServingURL = ndb.StringProperty()
    

    【讨论】:

      【解决方案2】:

      你要找的是get_serving_url(blob_key, size=None, crop=False, secure_url=None)

      在 blob 上试试这个方法,你会得到一个图片 url。

      Docs

      您上传 blob 并获得一个存储的 blobkey。把它想象成另一个实体的钥匙。 然后拥有该密钥,您可以使用 get_serving url 和其他几个函数来提供 url、调整大小等。

      【讨论】:

        【解决方案3】:

        您可以创建不同的处理程序来获取图像。你这样做的方式取决于使用的框架。金字塔示例(没有尝试和例外):

        #handler /{bookid}/coverimage
        def RenderImage(request):
          book_key = request.matchdict['bookid']
          book = Key(urlsafe=book_key}.get()
          cover = book.cover_image
          #optional rezising:
          cover = images.resize(cover, WIDTH, HEIGHT) #or other image operations
        
          response = Response(content_type="image/jpeg")
                            response.body = cover
                            return response
        

        在您的模板中:

        <img src="/{{book.key.urlsafe()}}/coverimage" />
        

        注意:您可以为任何图像属性执行通用图像处理程序,而不仅仅是“cover_image”

        【讨论】:

          猜你喜欢
          • 2013-07-24
          • 2015-02-06
          • 2014-10-21
          • 2012-06-11
          • 2014-05-05
          • 2012-01-14
          • 2015-05-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多