在Python中显示Blob图像(App Engine)

时间:2012-07-18 21:06:57

标签: python image google-app-engine blob

我无法在页面上显示图像。我可以把它存放得很好。

这些是处理程序:

class disp_image(webapp.RequestHandler):
    def get(self):
        key = self.request.get('key')
        image = Images.get(key)
        if image:
            self.response.headers['Content-Type'] = "image/png"
            return self.response.out.write(images.image)
        else:
            self.response.headers['Content-Type'] = "image/png"
            return self.response.out.write("/static/unknown.gif")

class Profile(MainHandler):
    def get(self):      
        if self.user:
            self.render('profile.html', username = self.user.name, email = self.user.email, first_name = self.user.first_name, last_name = self.user.last_name, country = self.user.country, prov_state = self.user.prov_state, city_town = self.user.city_town)
        else:
            self.redirect('/register')

class Change_Profile_Image(MainHandler):
    def get(self):
        if self.user:
            self.render('change_profile_image.html', username = self.user.name, firstname=self.user.first_name)
        else:
            self.render('change_profile_image.html')

    def post(self):
        images = Images()
        imageupl = self.request.get('img')
        images.image = db.Blob(imageupl)
        images.put()
        self.redirect('/profile')

db stuff是如下:

class Images(db.Model):
    image = db.BlobProperty()

class User(db.Model):
    name = db.StringProperty(required=True)
    pw_hash = db.StringProperty(required=True)
    email = db.StringProperty(required=True)
    first_name = db.StringProperty()
    last_name = db.StringProperty()
    country = db.StringProperty()
    prov_state = db.StringProperty()
    city_town= db.StringProperty()
    clan= db.StringProperty()
    handle= db.StringProperty()

表格:

<form enctype="multipart/form-data" method="post">
       <input type="file" name="img" />
</form>

我的代码模板替换位:

<img src="/disp?key={{image}}" /></img>

3 个答案:

答案 0 :(得分:2)

您不必自己提供图像。 Google可以免费使用Google高性能图像服务来完成这项工作! 请参阅:https://developers.google.com/appengine/docs/python/images/functions get_serving_url(blob_key,size = None,crop = False,secure_url = None) 您只需获取服务URL一次并将其保存以用于Images模型类中的HTML模板。

答案 1 :(得分:2)

首先,我认为你混淆了图像键和图像二进制数据。

模板

您应该将图像键(字符串)写入模板:

 <img src="/disp?key={{image_key}}" />

即。如果你只是将image.key()传递给你的模板,你的最终html应如下所示:

 <img src="/disp?key=AC3CK3333KCCK2K213" />

您可以将其视为两个步骤。您渲染模板。用户浏览器呈现html并进入图像处理程序。然后图像处理程序发送二进制数据。

(顺便说一句,我的印象是您使用<img ... /><img ...></img>关闭html标记,而不是<img .../></img>

图像处理程序

在图像处理程序disp_image中,您应该返回图像的二进制数据。看起来你的第一个条件还可以,但我认为你的其他条件只会返回文本“/static/unknown.gif”而不是gif文件的实际二进制数据。

    else:
        self.response.headers['Content-Type'] = "image/png"
        return self.response.out.write("/static/unknown.gif")

您应该将unknown.gif存储在数据存储区中并通过密钥引用它,或者您应该将"/static/unknown.gif"网址写入模板,而不是"/disp?key=..."

最后,测试图像处理程序是否正常工作的最简单方法是将<domain>/disp?key=...插入浏览器URL栏时,它应该加载所需的图像。

答案 2 :(得分:1)

我不确定,但我认为你不应该从disp_image类的get方法返回。

class disp_image(webapp.RequestHandler):
    def get(self):
        key = self.request.get('key')
        image = Images.get(key)
        if image:
            self.response.headers['Content-Type'] = "image/png"
            self.response.out.write(images.image)
        else:
            self.response.headers['Content-Type'] = "image/png"
            self.response.out.write("/static/unknown.gif")

你能解释调用模板渲染的位置吗?你在哪里传递image属性?

相关问题