2011-03-16 60 views
0

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

回答

4

您不能直接嵌入圖片插入模板; 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

0

我同意亞當克羅斯蘭在大多數情況下的方法,但如果圖像足夠小(在大多數瀏覽器中爲< 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