检索图像从谷歌数据存储显示

问题描述:

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 = b0a110a823 d936d97dba83d5c8b32c7a078d3ac4

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

编辑: 这不起作用:

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

您不能直接嵌入图片插入模板; HTML不能这样工作。您需要嵌入一个<img>标记,其中包含一个src属性,该属性可提供应用程序将回答以提供URL的URL。我只使用Django的模板部分,所以如果你使用全栈,你将不得不翻译一些这些想法,我不能帮上忙。

你Django的模板会是这个样子:

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

你会需要有一个路由处理/技能/ 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可以做你想做的。你绝对不想返回另一个模板;你想要返回图像的数据,这就是全部。

+0

这里有一个例子:http://code.google.com/appengine/articles/python/serving_dynamic_images.html – Calvin 2011-03-16 18:06:18

+0

选择render_to_response回报(TEMPLATE_NAME, 当地人() , context_instance = RequestContext(request,params),mimetype =“image/png”)我试过了,但它不起作用。如何将内容类型合并到我的views.py(django)? – 2011-03-16 18:35:07

+0

@Lynn:我无法真正理解您评论中的代码,因此我将代表您将其编辑到您的问题中,好吗? – 2011-03-16 19:43:51

我同意亚当克罗斯兰在大多数情况下的方法,但如果图像足够小(在大多数浏览器中为< 128k,在IE中为小),则可以使用数据URI方案进行服务。

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

基本上图像数据的Base64编码,以信息少量告诉浏览器如何处理这些数据。

+0

数据URIs非常甜蜜,但它们并不是由所有浏览器处理。 – 2011-03-16 19:42:42

+0

的确如此,但我的理念是:“有旧浏览器的人如果不喜欢它,就可以回到AOL主页。” – Calvin 2011-03-16 19:58:57

+0

令人敬畏的PROTIP。我将在我的项目经理中使用那个。 :) – 2011-03-16 20:09:59

我觉得这个职位将帮助你很多store-jpg-gif-png-etc-it-gae-datastore