2012-05-08 4 views
1

Google App EngineとDjangoフォームが新しくなりました。次のコードを実行しようとすると、エンコードエラーが発生します。Google App Engineでこのエンコーディングエラーを修正するには

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 - 

トレースバックは私の問題を解決するための十分な情報を与えるものではありません。何か案は?

+0

これは完全なトレースバックだと確信していますか? – aschmid00

答えて

1

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

データの一部はunicode/utf-8ではありません。私はいくつかの機会にGAEを使ってこの問題を抱えていました。それは何らかの形でユニコードではないソースコードではなく、常にデータです。

データおよび/またはソースの書式を検査し、すべてをutf-8/unicodeに設定すると動作します。あなたはすでにすべてをutf-8に設定しているように見えるかもしれませんが、まだこのエラーが出ている場合は、文字列などがutf-8以外の文字セットであることを意味します。

+0

はい、これはそれです。 Python 2.5と2.7のコードを混在させた場合の危険性があります。 – Busilinks

関連する問題