JSON отображается как юникод-сущность в шаблоне Jinja2 - PullRequest
12 голосов
/ 03 января 2012

Я использую Jinja2 с webapp2.

Jinja2 кодирует все «контекстные» данные в юникод, как говорит их документ.Это оказывается проблематичным, когда я пытаюсь вставить строку json в шаблон:

jsonData = json.loads(get_the_file('catsJson.txt'))

Я передаю jsonData в шаблон и могу успешно зациклить его, но когда вставляю элемент json в HTMLэто выглядит так:

<option value='[u&#39;dogs&#39;, u&#39;cats&#39;]'>

Я хочу, чтобы это выглядело так (как в исходной строке json):

<option value='["dogs", "cats"]'>

Есть предложения?

Ответы [ 3 ]

21 голосов
/ 03 января 2012

Вы должны отфильтровать значение через фильтр safe, чтобы сообщить jinja2, что оно не должно применять никакие другие фильтры к выходным данным.В синтаксисе jinja2 это будет:

{{ jsonData | safe }}

Обратите внимание, что, поскольку вы звоните json.loads, у вас больше нет данных json, у вас есть объект списка Python.Таким образом, когда он сериализован, он аналогичен вызову unicode(['dogs', 'cats']), который даст вам ваш префикс u.Возможно, вы не захотите фактически анализировать данные json, или вам нужно будет вручную превратить список в строку вместо того, чтобы jinja2 сделал это за вас.

0 голосов
/ 30 мая 2018

Если вам не нужно работать с массивом на стороне Jinja, а просто передать пакет в javascript, я бы рекомендовал использовать:

json.dumps(python_object_or_array)

https://docs.python.org/2/library/json.html

Эта строковая переменная, когда она передается в jinja, передается в javascript без получения пиктонических меток Юникода на переменных.И, между прочим, скорее всего, исправит True и False и будет исправлено на true и false, как и ожидал javascript.

Так что в контексте фляги это будет выглядеть примерно так:

@app.route('/')
def home():
     if userNeedsToLogin():
          session['routePath'] = request.full_path
          return render_template('login.html', error=None)
     else:
          return render_home()

def render_home():
     print "Rendering Home"
     results = get_some_database_query_results()
     data_out = json.dumps(results)
     return render_template('home.html', data=data_out)

home.html

<!DOCTYPE HTML>
<html>
<head>
  <!-- import javascript function processData -->
</head>
<body>
  <!-- page of stuff -->
  <script>
     processData( {{ data|safe }} );
  </script>
</body>
</html>
0 голосов
/ 24 января 2017

В Jinja 2.9 я следовал совету @ Xion, чтобы сначала преобразовать итерируемые элементы в строку, используя map('string').Результат фильтра карты я затем преобразовал в список, который в итоге выводится в формате JSON, используя встроенный фильтр tojson.

{{ jsonData|map('string')|list|tojson }} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...