Юникод ошибка колба jinja2

Проблема заключается в том, что большинство обобщающих материалов исчезнет во время компиляции.

Одним из распространенных решений является сохранение типа во время создания объекта.

Для краткого введения в поведение типа Erasure java прочтите эту страницу

0
задан snakecharmerb 20 April 2019 в 15:04
поделиться

2 ответа

Я получил этот диктат:

task_formatted.append(str(item['entity']))

Я преобразую его в str, затем добавляю в список, чтобы я мог легко передать его в свой шаблон

Этот код не делает то, что вы думаете.

>>> entity = {'type': 'Asset', 'id': 1404, 'name': 'Test-Asset commé'}
>>> str(entity)
"{'type': 'Asset', 'id': 1404, 'name': 'Test-Asset comm\\xc3\\xa9'}"

Когда вы вызываете str для словаря (или списка), вы не получаете результат вызова str для каждого ключа и значений словаря: вы получаете repr [1118 ] каждого ключа и значения. В этом случае это означает, что 'Test-Asset commé' был преобразован в 'Test-Asset comm \ xc3 \ xa9' способом, который трудно изменить.

>>> str(entity).decode('utf-8')  # <- this doesn't work.
u"{'type': 'Asset', 'id': 1404, 'name': 'Test-Asset comm\\xc3\\xa9'}"

Если вы хотите визуализировать свои словари в шаблоне, используя только {{ item }}, вы можете использовать модуль json для их сериализации вместо str. Обратите внимание, что вам нужно преобразовать json (который имеет тип str) в экземпляр unicode , чтобы избежать UnicodeDecodeError при рендеринге шаблона.

>>> import json
>>> template = jinja2.Template(u"""<td>{{item}}</td>""")
>>> j = json.dumps(d, ensure_ascii=False)
>>> uj = unicode(j, 'utf-8')
>>> print template.render(item=uj)
<td>{"type": "Asset", "id": 1404, "name": "Test-Asset commé"}</td>

Некоторые общие замечания / выводы:

  • Не используйте str (или unicode) для сериализации контейнеров, таких как словари или списки; используйте инструменты, такие как json или pickle .
  • Убедитесь, что любые строковые литералы, которые вы передаете jinja2, являются экземплярами unicode, а не str
  • При использовании Python2, если есть вероятность того, что ваш код будет обрабатывать не-ascii значения, всегда используйте unicode, никогда не используйте str.
  • [Тысяча сто тридцать одна]
0
ответ дан snakecharmerb 20 April 2019 в 15:04
поделиться

Я нашел решение для своей проблемы:

unicodedata.normalize('NFKD', unicode(str(item['entity']['type']) + str(item['entity']['name']),'utf-8'))

сначала я преобразовываю свой dict в строку с помощью str (), а затем превращаю его в UTF-8 Unicode с Unicode ('str', 'utf -8 ') завершить финально после импорта unicodedata. Я использую unicodedata.normalize ()

Надеюсь, это поможет людям

0
ответ дан Aurele Collinet 20 April 2019 в 15:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: