Проблема с Python + mako Unicode - PullRequest
       14

Проблема с Python + mako Unicode

2 голосов
/ 12 сентября 2011

Я пытаюсь прочитать содержимое таблицы БД и отобразить ее как веб-страницу, используя mako и bottle.В таблице есть несколько полей Unicode (utf-8).

UnicodeDecodeError('ascii', 'MOTOROLA MILESTONE\xe2\x84\xa2 PLUS', 
                   18, 19, 'ordinal not in range(128)')

Со следующей трассировкой стека:

Traceback (most recent call last):
  File "/workspace/web/controller/bottle.py", line 499, in handle
    return handler(**args)
  File "webserver/webserver.py", line 101, in download
    return html_tmpl(tmpl, **kwds)
  File "webserver/webserver.py", line 116, in html_tmpl
    return tmpl.render(**kwds)
  File "/usr/lib/python2.5/site-packages/Mako-0.3.4-py2.5.egg/mako/template.py", line 189, in render
    return runtime._render(self, self.callable_, args, data)
  File "/usr/lib/python2.5/site-packages/Mako-0.3.4-py2.5.egg/mako/runtime.py", line 403, in _render
    _render_context(template, callable_, context, *args, **_kwargs_for_callable(callable_, data))
  File "/usr/lib/python2.5/site-packages/Mako-0.3.4-py2.5.egg/mako/runtime.py", line 434, in _render_context
    _exec_template(inherit, lclcontext, args=args, kwargs=kwargs)
  File "/usr/lib/python2.5/site-packages/Mako-0.3.4-py2.5.egg/mako/runtime.py", line 457, in _exec_template
    callable_(context, *args, **kwargs)
  File "download_android_index_html", line 41, in render_body
  File "download_android_index_html", line 23, in fill_devices
  File "download_android_index_html", line 68, in render_fill_devices
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 18: ordinal not in range(128)

Вызывающая функция:

def html_tmpl(tmpl, **kwds):
    kwds['nav'] = templates_lookup.get_template('nav.html').render()
    kwds['nav_bottom'] = templates_lookup.get_template('nav_bottom.html').render()
    base_path = request.path.replace("de/","").replace("fr/","")
    kwds['languages'] = templates_lookup.get_template('languages.html').render(en_url=base_path,fr_url="/fr"+base_path)
    kwds['analytics'] = ''
    return tmpl.render(**kwds)

Как мне это сделать?Я пытался:

return tmpl.render_unicode(**kwds)` 

и

return tmpl.render_unicode(**kwds).encode('utf-8', 'replace')

без удачи, и этот ответ мало помог.

Есть идеи?

1 Ответ

1 голос
/ 12 сентября 2011

Проблема не в том, что render_unicode не может преобразовать объект Unicode Python в utf8, он в том, что существует строковый объект, который, как он предполагает, является ascii и содержит данные не ascii.

Начать с начала - декодироватьвсе входящие строки в Unicode внутри.У вас есть строковый ввод, который нужно исправить.

Я предлагаю вам попробовать назвать все переменные на границе с помощью своего рода венгерской записи - возможно, rawstr_myvar и u_myvar.

...