【问题标题】:Python datastructures into js datastructures using Django templates (lists and dicts)使用 Django 模板(列表和字典)将 Python 数据结构转换为 js 数据结构
【发布时间】: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 。你是怎么做到的?

标签: javascript python django django-templates


【解决方案1】:

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

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

【讨论】:

  • 如果包含用户生成的数据,请不要使用它;如果在<script> 标记内使用,用户可以使用</script><script>alert('p4wned!')</script> 作为内容的一部分进行突破。将所有尖括号、单引号和 & 符号转义为 JSON \uxxxx 转义代码too
猜你喜欢
  • 2014-05-27
  • 2018-02-25
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多