【问题标题】:Displaying Blob Images in Python (App Engine)在 Python (App Engine) 中显示 Blob 图像
【发布时间】:2012-07-18 00:27:34
【问题描述】:

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

这些是处理程序:

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>

【问题讨论】:

  • 你有什么问题? (404、垃圾内容等?)您也可以发布您的 app.yaml 和路由设置。
  • {{image}} 未通过。另外,我手动插入了图像键,但仍然没有显示图像。
  • Yaml {{ application: suitegamer version: 1 runtime: python27 api_version: 1 threadsafe: true handlers: - url: /static static_dir: static - url: /img static_dir: img - url: /.* script: main.app libraries: - name: jinja2 version: latest - name: PIL version: "1.1.7"}}
  • 我会先尝试看看 /disp?key= 是否有效。你能发布与每个处理程序关联的路线吗?
  • 您已经(几乎)向我们展示了所有相关代码,这很好,但您实际上并没有解释问题所在。

标签: python image google-app-engine blob


【解决方案1】:

首先,我认为您混淆了图像密钥和图像二进制数据。

模板

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

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

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

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

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

(顺便说一句,我的印象是你用&lt;img ... /&gt;&lt;img ...&gt;&lt;/img&gt; 关闭你的html 标签,而不是&lt;img .../&gt;&lt;/img&gt;

图像处理程序

在您的图像处理程序 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" 网址写入您的模板以代替 "/disp?key=..."

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

【讨论】:

    【解决方案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 模板中使用。

    【讨论】:

    • 它不是免费的。您为传出的带宽付费。
    • 这有点随机,但是你会因为支持 GAE 得到谷歌的报酬吗?哈哈——你肯定是一个超级粉丝,一开始我喜欢它的简单性,但现在它开始变得有点低效了,过于复杂。
    【解决方案3】:

    我不确定,但我认为你不应该从 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 属性?

    【讨论】:

    • 我想通了。我经历了太多教程,似乎代码是剩余的,但没有被 python 作为错误拾取。非常狡猾。谢谢大家。
    • 您能告诉我们您为解决问题所做的更改吗?它可以帮助未来的用户。 :)
    • suitegamer,请发布您的最终解决方案。我有同样的问题,没有找到答案。
    猜你喜欢
    • 2013-07-30
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 2010-10-20
    • 2015-05-28
    • 1970-01-01
    • 2017-07-28
    • 2017-12-16
    相关资源
    最近更新 更多