我正在尝试使用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库。关于如何解决这个问题的任何想法?
提前感谢您的帮助。
答案 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会尽可能在各个级别缓存它。