检索要从Google数据存储区显示的图像

时间:2011-03-16 17:54:26

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

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")

3 个答案:

答案 0 :(得分:4)

您无法将图片直接嵌入模板中; HTML无法正常工作。您需要嵌入一个带有<img>属性的src代码,该属性会提供您的应用将回答的URL以提供该网址。我只使用Django的模板部分,所以如果你使用全栈,你将不得不翻译其中的一些想法,我对此无能为力。

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

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

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

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可能会做你想要的。你绝对不想要返回另一个模板;你想要返回图像的数据,那就是全部。

答案 1 :(得分:0)

我同意Adam Crossland在大多数情况下的方法,但如果图像足够小(在大多数浏览器中小于128k,在IE中较小),则可以使用数据URI方案为其提供服务。

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

基本上是对图像数据的Base64编码,只需要少量信息就可以告诉浏览器如何处理数据。

答案 2 :(得分:0)

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