2012-05-08 2 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에이 문제가 발생하면 모든 데이터를 유니 코드/utf-8로 정리 한 다음 작동합니다.

일부 데이터는 unicode/utf-8이 아닙니다. 나는 GAE와 함께 여러 차례이 문제를 겪었으며, 항상 어떤 식 으로든 유니 코드가 아닌 소스 코드가 아닌 데이터입니다.

데이터 및/또는 소스 형식을 검사하고 모든 것을 utf-8/유니 코드로 설정하면 작동합니다. utf-8로 모든 것을 이미 설정 한 것처럼 보일지 모르지만 여전히이 오류가 발생하면 utf-8보다 일부 문자열 또는 다른 문자셋이 있음을 의미합니다.

+0

예,이게 전부입니다. Python 2.5와 2.7 코드를 혼합 할 때의 위험이 있습니다. – Busilinks

관련 문제