UnicodeDecodeError错误。在渲染blob图像时

时间:2012-07-13 17:51:36

标签: google-app-engine jinja2 blobstore

我正在尝试添加上传图片功能。 此类保存新实体:

class NewPost(Handler):
    def render_newpost(self, title='' , content='', error = ''):
        self.render("newpost.html", title = title, content = content, error = error)


    def get(self):
        user_cookie = self.request.cookies.get('user')
        if user_cookie:
            user_id = user_cookie.split('|')[0]
            if hash_str(user_id) == user_cookie.split('|')[1]:
                user = Users.get_by_id(int(user_id))
                self.render_newpost()
        else:
            self.redirect('/')


    def post(self):
        title = self.request.get("title")
        content = self.request.get("content")
        image = self.request.get("file")

        if title and content:
            p = Posts(title = title, content = content)
            p.image=db.Blob(image)
            p.put()
            self.redirect("/")
        else:
            error = "Enter both title and text"
            self.render_newpost(title, content, error)

这是我的首页渲染类:

class Main(Handler):
    def get(self):
        posts = db.GqlQuery("SELECT * FROM Posts Order by created DESC LIMIT 10")
        user_cookie = self.request.cookies.get('user')
        if user_cookie:
            user_id = user_cookie.split('|')[0]
            if hash_str(user_id) == user_cookie.split('|')[1]:
                user = Users.get_by_id(int(user_id))
                self.render("front.html", posts = posts, user=user)
        else:
            self.response.headers['Content-Type'] = "image/jpeg"
            self.render("front.html", posts = posts)

表单输入数据:

     <form method="post" enctype="multipart/form-data">
        <div class="newpost">
            <label>Image:</label>
            <input type="file" name="file"/>
            <div class="label">Title: 
                <input type="text" name="title" value="{{title}}"/>
            </div>
           <hr> 
            <div class="label">Content:
                <textarea name="content">{{content}}</textarea>
            </div>
        </div>
        <input type="submit"/>
        <div class="error">{{error}}</div>
    </form>

这是我的主页模板:(问题出现在这里!)

            {% for post in posts %}
                {% if post.image %}
                <li><img src="/static/images/{{post.image}}"/>
                {% endif %}
                    <h4><a href="#">{{post.title}}</a></h4>
                    <p class="zoom">{{post.content}}</p>
            {% endfor %}

应用程序成功存储图像,但当它返回到尝试渲染图像的首页时,会出现此错误:

文件“/home/wanhrust/google_appengine/newsite/templates/front.html”,第54行,位于顶级模板代码中     

  • {{post.image}} UnicodeDecodeError:'ascii'编解码器无法解码位置0的字节0xff:序数不在范围内(128)

    我一直在谷歌搜索几个小时但没有结果。有什么帮助吗?

  • 1 个答案:

    答案 0 :(得分:3)

    问题是你试图在html文档中嵌入一个不可能的图像。 Post.image存储代表图像的字节。

    如果您想在html中包含图片,则需要添加类似

    的内容
    {% if post.image_id %}
        <li><img src="/image/{{post.image_id}}" />
    {% endif %}
    

    其中/ image /是一个返回图像内容的处理程序(设置apprpriate内容类型)。

    我还建议您使用Blobstore API