Хорошо, некоторые комментарии:
foo = unicode(self.request.get('foo'), 'utf-8') #convert to unicode
Не называйте это "конвертировать".Назовите это «расшифровывать», это проясняет.
foo = foo.encode('utf-8') #encode with utf-8
Но почему?Вы только что расшифровали его из UTF8, почему вы его кодируете обратно?Вы также можете сделать:
foo = self.request.get('foo')
Это эквивалентно двум вышеупомянутым строкам.
Чтобы уменьшить путаницу в Юникоде, прочитайте это: http://www.joelonsoftware.com/articles/Unicode.html