从Google 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
我觉得这篇文章会对你帮助很大,内容是关于如何在Google App Engine的数据库中存储jpg、gif、png等图片格式的,具体可以查看这个链接。
0
我同意Adam Crossland在大多数情况下的方法,但如果图片足够小(在大多数浏览器中小于128k,在IE中更小),你可以使用数据URI方案来提供它。
http://en.wikipedia.org/wiki/Data_URI_scheme
简单来说,就是把你的图片数据用Base64编码,然后加上一点小信息告诉浏览器该如何处理这些数据。
4
你不能直接把图片嵌入到模板里;HTML不是这样工作的。你需要插入一个<img>
标签,并且给它一个src
属性,这个属性里要写一个网址,告诉你的应用程序去哪里获取这张图片。我只用Django的模板部分,所以如果你在用完整的框架,你可能需要把这些想法转换一下,我帮不了太多忙。
你的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,里面包含图片的内容,可能就是你想要的。你绝对不想返回另一个模板;你只想返回图片的数据,仅此而已。