2012-05-08 42 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的幾次會議上遇到過這個問題,它始終是數據,而不是以某種方式不是unicode的源代碼。

如果您檢查您的數據和/或源格式並將所有內容設置爲utf-8/unicode,它將起作用。看起來你已經將所有的東西都設置爲utf-8,但是如果你仍然得到這個錯誤,這意味着一些字符串或類似的字符串是utf-8以外的其他字符集。

+0

是的,我就是這樣。這就是python 2.5與2.7代碼混合的危險。 – Busilinks