我对这个问题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'}];
有没有这样做?
非常感谢, 标记
答案 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可视化格式正确。
非常感谢!