在Google App Engine上提供图片 - ascii编程解码错误

时间:2014-02-05 15:25:36

标签: python google-app-engine codec

我正在尝试使用Google App Engine上的Python动态提供图片,要求用户输入名称,评论并可能加载图片。

我创建了以下类:

class Comment(db.Model):
    name = db.StringProperty(required=True)
    comment = db.TextProperty(required=True)
    created = db.DateTimeProperty(auto_now_add=True)
    image = db.BlobProperty()

然后我写了post方法:

def post(self):
    name = self.request.get("name")
    comment = self.request.get("comment")
    image = self.request.get("img")
    if name and comment:
        if image:
            c = Comment(name=name, comment=comment)
            image = images.resize(self.request.get('img'), 32, 32)
            c.image = db.Blob(image)
            c.put()
            time.sleep(0.5)
            self.redirect("/")

get方法将表示如下:

def render_front(self, name="", comment="", image="", error=""):
    comments = Comment.all().order('-created')
    self.render("front.html", name=name, comment=comment, image=image, error=error, comments=comments)

def get(self):
    self.render_front()

我终于在我的HTML模板中提供了这个:

{% for e in comments %}
    <div class="comment">
        <div class="comment-name">
            {{e.name}}
        </div>
        <pre class="comment-content">
            {{e.comment}}
            <br>
            on {{e.created}}
        </pre>
        <div class="comment-image">
            {{e.image}}
        </div>
    </div>
{% endfor %}

我遇到以下错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0x89 in position 0: ordinal not in range(128)

我顺便安装了PIL库。关于如何解决这个问题的任何想法?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您有几个选择 请注意,这是pesudo代码,肯定需要修复。

更简单的方法是在html中添加指向图像的链接

 <a href="./image/?key={{e.key()}}">

浏览器将为图像创建一个新的http请求,然后您创建一个处理程序来为此请求提供图像(并且只有图像)。

def get(self):
    c = Comment.get(self.request.get("key"))
    self.response.headers['Content-Type'] = "image/jpeg"
    self.response.out.write(c.image)

第二种解决方案是将图像封装在html流中,如

<img src="data:image/gif;base64,RAAA...more data.....">

你需要对数据进行base64编码,但这是python中的标准。

第三种解决方案是将图像存储在blobstore中,并在html页面中添加一个链接(与解决方案1一样)。这样做的好处是,提供图像不会加载您的应用引擎服务器,并且将使用Google静态数据服务器,因此Google会尽可能在各个级别缓存它。