使用 Django 模板(列表和字典)将 Python 数据结构转换为 js 数据结构

Posted

技术标签:

【中文标题】使用 Django 模板(列表和字典)将 Python 数据结构转换为 js 数据结构【英文标题】:Python datastructures into js datastructures using Django templates (lists and dicts) 【发布时间】:2012-03-21 18:37:31 【问题描述】:

我有一个 Django 视图,它返回一个这样的字典列表

data = ['year': 2006, 'books': 54,
        'year': 2007, 'books': 43,
        'year': 2008, 'books': 41,
        'year': 2009, 'books': 44,
        'year': 2010, 'books': 35]

c = 
    'data': data,
    
return render(request, 'template.html', c)

模板文件中包含一些基本的 javascript,可以执行类似的操作。

var data = "data";
console.log(data);
//..... Then other functions

问题是数据通过如下格式的模板进入 JavaScript,其中 ' 用于引号。

'books': 4, 'year': 2010, 'books': 7, 'year': 2011

我尝试使用以下命令将字典列表转储到 python 中的 json 字符串:

simplejson.dumps(data)

但没有快乐。有关修复的任何建议和想法?人们如何使用 django 模板将 python 数据结构转换为 js 数据结构

注意:理想情况下,js 数据变量应如下所示:

var data = [year: 2006, books: 54,
        year: 2007, books: 43,
        year: 2008, books: 41,
        year: 2009, books: 44,
        year: 2010, books: 35];

【问题讨论】:

我也有同样的问题,但我的问题是如何将python变量字符串转成js参数?所以在你上面的例子中,python 的 'year' 和 'books' 变量在 js 脚本中是 year 和 book 。你是怎么做到的? 【参考方案1】:

这是 django 设计的一部分,旨在阻止用户生成的数据未经转义进入输出。 (XSS预防等)

为了解决这个问题,您需要使用json.dumps() 的组合(在 py>=2.6 中不推荐使用simplejson)来确保输出是 JS 安全的,并使用var data = " data|safe " 来明确告诉 django 不要逃跑该变量的输出。

【讨论】:

如果包含用户生成的数据,请不要使用它;如果在<script> 标记内使用,用户可以使用</script><script>alert('p4wned!')</script> 作为内容的一部分进行突破。将所有尖括号、单引号和 & 符号转义为 JSON \uxxxx 转义代码too

以上是关于使用 Django 模板(列表和字典)将 Python 数据结构转换为 js 数据结构的主要内容,如果未能解决你的问题,请参考以下文章

Django 模板和列表字典的一部分

如何在 Django 模板中访问字典列表

django 默认模板字典和列表的写法

Django模板:从字典访问值列表

Django 模板列表的第一个元素

通过 Django 模板中的列表字典进行处理