2009-07-16 2 views
2

Beim Versuch, eine Django Template-Datei in Google App Engine zu rendernGoogle App Engine Vorlage Unicode-Dekodierung Problem

from google.appengine.ext.webapp import template

templatepath = os.path.join(os.path.dirname(file), 'template.html')
self.response.out.write (template.render(templatepath , template_values))

stoße ich auf dem folgenden Fehler:

<type 'exceptions.UnicodeDecodeError'>: 'ascii' codec can't decode byte 0xe2 in position 17692: ordinal not in range(128)
args = ('ascii', '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Str...07/a-beautiful-method-to-find-peace-of-mind/ -->
', 17692, 17693, 'ordinal not in range(128)')
encoding = 'ascii'
end = 17693
message = ''
object = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Str...07/a-beautiful-method-to-find-peace-of-mind/ -->
reason = 'ordinal not in range(128)'
start = 17692

Es scheint, dass die zugrunde liegende django Vorlage Engine hat die "ascii" -Codierung angenommen, die "utf-8" hätte sein sollen. Wer weiß, was das Problem verursacht und wie es gelöst werden kann? Danke.

+1

Was ist der Wert von DEFAULT_CHARSET? könnte helfen. – lavinio

Antwort

6

Nun ersetzen, die gerenderten Ergebnisse stellt sich heraus, durch die Vorlage zurück muss zuerst dekodiert werden:

self.response.out.write (template.render(templatepath , template_values).decode('utf-8'))

Ein dummer Fehler, aber t Für die Antworten sowieso. :)

1

Haben Sie in Ihrem Texteditor eingecheckt, dass die Vorlage in utf-8 codiert ist?

2

Verwenden Sie Django 0.96 oder Django 1.0? Sie können durch einen Blick auf Ihre main.py überprüfen und zu sehen, ob es die folgendes enthält:

 
from google.appengine.dist import use_library 
use_library('django', '1.0')

Wenn Sie Django verwenden 1.0, beide FILE_CHARSET und DEFAULT_CHARSET zu ‚utf-8‘ in Verzug. Wenn Ihre Vorlage in einer anderen Kodierung gespeichert wird, legen Sie einfach FILE_CHARSET auf den jeweiligen Wert fest.

Wenn Sie Django 0.96 verwenden, möchten Sie möglicherweise versuchen, die Vorlage direkt von der Festplatte zu lesen und dann die Codierung manuell zu bearbeiten.

zB

template.render(templatepath , template_values)

mit

Template(unicode(template_fh.read(), 'utf-8')).render(template_values)