【问题标题】: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”