5

我无法让图像显示在页面上。我可以很好地保存它。

这些是处理程序:

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的东西如下:

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>
4

3 回答 3

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 并保存它用于您的图像模型类中的 HTML 模板。

于 2012-07-19T00:16:48.393 回答
2

一方面,我认为您将图像密钥和图像二进制数据混合在一起。

模板

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

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

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

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

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

(顺便说一句,我的印象是你用一个<img ... />或关闭你的html标签<img ...></img>,而不是两个<img .../></img>

图像处理程序

在您的图像处理程序 disp_image 中,您应该返回图像的二进制数据。看起来你的第一个条件没问题,但我认为你的 else 条件只会返回文本“/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"url 写入模板以代替"/disp?key=..."

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

于 2012-07-21T06:13:30.687 回答
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属性?

于 2012-07-18T22:00:00.777 回答