【问题标题】:Retrieve image to display from google datastore从谷歌数据存储中检索要显示的图像
【发布时间】:2011-03-17 13:04:47
【问题描述】:

models.py

class Badge(db.Model):
user = db.ReferenceProperty(User, collection_name='user_badges')
skill = db.ReferenceProperty(Skill, collection_name='skill_badges')
points = db.FloatProperty(required=True)

class Skill(db.Model):
skill_id = db.StringProperty()
name = db.StringProperty()
description = db.StringProperty()
picture = db.BlobProperty(default=None)

class User(db.Model):
user_id = db.StringProperty(required=True)
nickname = db.StringProperty(required=False)
email = db.StringProperty(required=False)

views.py

user = common.get_user(request)
if not user:
    return auth_error(common.getHostURI(request), request)

html

{% for badge in user.user_badges %}
  {{ badge.skill.picture }}                            
{% endfor %}

图片的数据存储条目的示例是:

3601 字节,SHA-1 = b0a110a823d936d97dba83d5c8b32c7a078d3ac4

如何从数据存储中检索此图像> 如果我使用 badge.skill.picture,它会返回为空。

编辑: 这不起作用:

return render_to_response(template_name, locals(), context_instance=RequestContext(request, params), mimetype="image/png")

【问题讨论】:

    标签: python django google-app-engine google-cloud-datastore


    【解决方案1】:

    您不能将图片直接嵌入到模板中; HTML 不能那样工作。您需要嵌入一个带有src 属性的<img> 标记,该属性提供一个URL,您的应用程序将响应该URL 以提供该URL。我只使用了 Django 的 Templates 部分,所以如果你使用的是全栈,你将不得不翻译其中的一些想法,我对此无能为力。

    您的 Django 模板看起来像这样:

    {% for badge in user.user_badges %}
      <img src="/skill/get_picture/{{ badge.skill.key }}">                            
    {% endfor %}
    

    并且您将需要一个处理 /skill/get_picture/:id 的路由。为处理此路由而调用的控制器代码如下所示:

    from google.appengine.ext import db
    from models import Skill
    
    requested_skill = db.get(id) # id comes from the :id param in the URL
    return HttpResponse(requested_skill.picture, mimetype="image/png")
    

    我认为返回带有图像内容的 HttpResponse 可能会满足您的需求。您绝对不想返回另一个模板;您想返回图像的数据,仅此而已。

    【讨论】:

    • return render_to_response(template_name, locals(), context_instance=RequestContext(request, params), mimetype="image/png") 我试过这个,但它不起作用。如何将内容类型合并到我的views.py(django)中?
    • @Lynn:我无法真正理解您评论中的代码,所以我将代表您将其编辑到您的问题中,好吗?
    • @Lynn:除了模板语言之外,我对 Django 的了解还不够多,不知道如何在 Django 中进行这项工作,但我会详细说明我的答案,看看我是否可以提供更多帮助。
    • 这应该可以开箱即用,只要确保按照@adam 的建议将图像添加到路由处理程序即可。 (r'^skill/get_picture/([^\.^/]+)$', views.get_skill_picture),
    【解决方案2】:

    在大多数情况下,我同意 Adam Crossland 的方法,但如果图像足够小(在大多数浏览器中小于 128k,在 IE 中更小),您可以使用 Data URI 方案来提供它。

    http://en.wikipedia.org/wiki/Data_URI_scheme

    基本上是图像数据的 Base64 编码,其中包含少量信息来告诉浏览器如何处理数据。

    【讨论】:

    • 数据 URI 非常棒,但并非所有浏览器都能处理。
    • 没错,但我的理念是:“使用旧浏览器的人如果不喜欢它,可以直接返回 AOL 主页。”
    • 真棒PROTIP。我将在我的项目经理身上使用那个。 :)
    • 128k 的上限有点高 - 它会使编码图像比其他大多数典型的 HTML 页面更大。
    【解决方案3】:

    我认为这篇文章对你有很大帮助store-jpg-gif-png-etc-it-gae-datastore

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多