使用jinja2模板(列表和dicts)将Python数据结构转换为js数据结构

时间:2014-04-13 15:04:23

标签: javascript python list jinja2

我对这个问题Python datastructures into js datastructures using Django templates (lists and dicts)有一个非常类似的问题,但是下一步 - python中变量名是字符串的变量如何成为javascript对象?

所以在python中我有这个:

data = [{'year': 2006, 'books': 54, 'author': 'fred'},
    {'year': 2007, 'books': 43, 'author': 'sue'},
    {'year': 2008, 'books': 41, 'author': 'bill'},
    {'year': 2009, 'books': 44, 'author': 'alex'},
    {'year': 2010, 'books': 35, 'author': 'fred'}]

我可以通过{{data |。输出到我的javascript中安全}}

但我希望我的javascript看起来像这样:

var data = [{year: 2006, books: 54, author: 'fred'},
    {year: 2007, books: 43, author: 'sue'},
    {year: 2008, books: 41, author: 'bill'},
    {year: 2009, books: 44, author: 'alex'},
    {year: 2010, books: 35, author: 'fred'}];

虽然它出现在这样的时刻:

var data = [{'year': 2006, 'books': 54, 'author': 'fred'},
    {'year': 2007, 'books': 43, 'author': 'sue'},
    {'year': 2008, 'books': 41, 'author': 'bill'},
    {'year': 2009, 'books': 44, 'author': 'alex'},
    {'year': 2010, 'books': 35, 'author': 'fred'}];

有没有这样做?

非常感谢, 标记

2 个答案:

答案 0 :(得分:2)

Flask附带的tojson filter负责生成一个也是HTML安全的有效Javascript子集:

var data = {{ data|tojson|safe }};

如果您没有使用Flask,那么register a custom filter就像:

import json

def tojson(obj):
    """Produce HTML-safe JSON"""
    return (json.dumps(obj)
                .replace(u'<', u'\\u003c')
                .replace(u'>', u'\\u003e')
                .replace(u'&', u'\\u0026')
                .replace(u"'", u'\\u0027'))

答案 1 :(得分:1)

解决方案是Martijn Pieters和traceur的组合,非常感谢:D

代码的工作版本是:

在Python中:

data = [{'year': 2006, 'books': 54, 'author': 'fred'},
{'year': 2007, 'books': 43, 'author': 'sue'},
{'year': 2008, 'books': 41, 'author': 'bill'},
{'year': 2009, 'books': 44, 'author': 'alex'},
{'year': 2010, 'books': 35, 'author': 'fred'}]

....rest of code....

variables = {
    'data' : data
    }
template = JINJA_ENVIRONMENT.get_template('main.html')
self.response.write(template.render(variables))

除此之外,我还必须为jinja2注册一个新的JSON过滤器:

JINJA_ENVIRONMENT = jinja2.Environment(
  loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
  autoescape=True,
  extensions=['jinja2.ext.autoescape'])

def tojson(obj):
 """Produce HTML-safe JSON"""
  return (json.dumps(obj)
            .replace(u'<', u'\\u003c')
            .replace(u'>', u'\\u003e')
            .replace(u'&', u'\\u0026')
            .replace(u"'", u'\\u0027'))

JINJA_ENVIRONMENT.filters['tojson'] = tojson

...然后在需要调用此过滤器的HTML中将其放在javascript中,而且还根据traceur的评论进行评估。 (我不知道为什么)

<script type="text/javascript">
  dataSource = eval('({{ data|tojson|safe }})')
  console.log(dataSource)
  ....do stuff with dataSource....
</script>

dataSource现在是一个js对象,它的ChartJS可视化格式正确。

非常感谢!