views:

901

answers:

3

When trying to render a Django template file in Google App Engine

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))

I come across the following error:

<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

It seems that the underlying django template engine has assumed the "ascii" encoding, which should have been "utf-8". Anyone who knows what might have caused the trouble and how to solve it? Thanks.

+1  A: 

Did you check in your text editor that the template is encoded in utf-8?

luc
+2  A: 

Are you using Django 0.96 or Django 1.0? You can check by looking at your main.py and seeing if it contains the following:

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

If you're using Django 1.0, both FILE_CHARSET and DEFAULT_CHARSET should default to 'utf-8'. If your template is saved under a different encoding, just set FILE_CHARSET to whatever that is.

If you're using Django 0.96, you might want to try directly reading the template from the disk and then manually handling the encoding.

e.g., replace

template.render( templatepath , template_values)

with

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

dmcer
+4  A: 

Well, turns out the rendered results returned by the template needs to be decoded first:

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

A silly mistake, but thanks for everyone's answers anyway. :)

Victor Yan