37

I am building a web application using Flask and Google App Engine. One of the pages in this web application makes a call via YouTube APIs to get videos given a search term.

I get the following error when I try to query YoutubeVids.html.

This only happens when when I pass a certain parameter via Jinja2 templates to the page.

file "/Users/xxxxx/App-Engine/src/templates/YoutubeVids.html", line 1, in top-level template code
    {% extends "master.html" %}
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)

INFO     2014-01-27 22:39:40,963 module.py:612] default: "GET /xxx/yyyy HTTP/1.1" 500 291
Lipis
  • 21,388
  • 20
  • 94
  • 121
Vinay Joseph
  • 5,515
  • 10
  • 54
  • 94

2 Answers2

93

Figured it out.

I put the following at the start of my python file

import sys
reload(sys)
sys.setdefaultencoding("utf-8")
Vinay Joseph
  • 5,515
  • 10
  • 54
  • 94
12

From the docs: Jinja2 is using Unicode internally which means that you have to pass Unicode objects to the render function or bytestrings that only consist of ASCII characters.

A normal string in Python 2.x is a bytestring. To make it unicode use:

byte_string = 'a Python string which contains non-ascii data like €äãü'
unicode_string = byte_string.decode('utf-8')

More: http://blog.notdot.net/2010/07/Getting-unicode-right-in-Python

voscausa
  • 11,253
  • 2
  • 39
  • 67
  • 2
    Also, [Pragmatic Unicode](http://nedbatchelder.com/text/unipain.html) by Ned Batchelder, [Flask's Unicode docs](http://flask.pocoo.org/docs/dev/unicode/) and [Jinja's Unicode docs](http://jinja.pocoo.org/docs/dev/api/#unicode). – Matt Nordhoff Apr 26 '15 at 16:19