1

GoogleAppEngineとDjangoフォームは初めてです。次のコードを実行しようとすると、エンコードエラーが発生します。

import webapp2
from google.appengine.ext import db
from google.appengine.ext.webapp import template

from django import newforms as forms
from google.appengine.ext.db import djangoforms

import os
import re

import fix_path
import config
import static

def slugify(s):
    return re.sub('[^a-zA-Z0-9-]+', '-', s).strip('-')

def format_post_path(post, num):
    slug = slugify(post.title)
    if num > 0:
        slug += "-" + str(num)
    return config.post_path_format % {
        'slug': slug,
        'year': post.published.year,
        'month': post.published.month,
        'day': post.published.day,
    }

def render_template(template_name, template_vals=None, theme=None):
    template_path = os.path.join("themes", theme or config.theme, template_name)
    return template.render(template_path, template_vals or {})

class BlogPost(db.Model):
    # The url path to the blog post. Posts have a path if they are published.
    path = db.StringProperty()
    title = db.StringProperty(required=True, Indexed=False)
    body = db.TextProperty(required=True)
    published = db.DateTimeProperty(auto_now_add=True)
    updated = db.DateTimeProperty(auto_now=True) 

def render(self):
    template_vals = {
        'config': config,
        'post': self,
    }
    return render_template("post.html", template_vals)

def publish(self):
    rendered = self.render()
    if not self.path:
        num = 0
        content = None
        while not content:
            path = format_post_path(self, num)
            content = static.add(path, rendered, "text/html")
            num += 1
        self.path = path
        self.put()
    else:
        static.set(self.path, rendered, "text/html")

class PostForm(djangoforms.ModelForm):
    class Meta:
        model = BlogPost
        exclude = ['path', 'published', 'update']

class PostHandler(webapp2.RequestHandler)
    def render_to_response(self, template_name, template_vals=None, theme=None):
        template_name = os.path.join("admin", template_name)
        self.response.out.write(render_template(template_name, template_vals, theme))

    def render_form(self, form):
        self.render_to_response("edit.html", {'form': form})

    def get(self):
        self.render_form(PostForm())

    def post(self)
        form = PostForm(date=self.request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.publish()
            self.render_to_response("published.html", {'post': post})
        else:
            self.render_form(form)

app = webapp2.WSGIApplication([('/admin/newpost', PostHandler)],
                              debug=True)

これがトレースバックです。

    ERROR    2012-05-08 10:35:03,609 cgi.py:121] Traceback (most recent call last):
      File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 676, in Decorate
        return func(self, *args, **kwargs)
      File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 1911, in get_code
        source_code.decode(encoding)
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128)

INFO     2012-05-08 10:35:03,627 dev_appserver.py:2891] "GET /admin/newpost HTTP/1.1" 500 -

トレースバックでは、問題を修正するのに十分な情報が得られません。何か案は?

4

1 に答える 1

1

appengineでこの問題が発生したとき、すべてのデータをunicode / utf-8にクリーンアップでき、それで機能しました。

一部のデータはUnicode/utf-8ではありません。私はGAEで何度かこの問題を抱えていましたが、何らかの形でユニコードではないのは常にデータであり、ソースコードではありません。

データやソースのフォーマットを調べて、すべてをutf-8 / unicodeに設定すると、機能します。すでにすべてをutf-8に設定しているように見えるかもしれませんが、それでもこのエラーが発生する場合は、文字列などがutf-8以外の文字セットであることを意味します。

于 2012-05-08T13:22:53.387 に答える