渲染unicode字符串时出现Django模板错误

时间:2016-02-14 16:46:14

标签: python django unicode

我将python列表传递给django模板,如下所示:

views.py中的

dat = [-77.448599999999999, 37.536900000000003, u'Virginia War Memorial', 1.0]
result={"dat":dat}
return render(request,'result_map.html', {'form': form,'result':result})

并在我的模板中:

var dat = {{ result.dat }}

但在渲染的html中我得到了:

var dat = [-77.448599999999999, 37.536900000000003, u'Virginia War Memorial', 1.0]

给出错误。

我怎样才能得到:

var dat = [-77.448599999999999, 37.536900000000003, 'Virginia War Memorial', 1.0]

感谢

2 个答案:

答案 0 :(得分:1)

如果你想要原始字符串,我认为你需要通过safe过滤器传递它: {{ result.dat|safe }}

如果您想影响较大的模板块,也可以使用{% autoescape off %}块。

答案 1 :(得分:0)

var dat = {{ result.dat }}

您尝试注入JavaScript,可能是在<script>块中。您需要使用JavaScript语法格式化的输出,但是您将隐式地将Python列表转换为字符串,这将提供Python语法列表文字,而不是JavaScript。存在许多差异,包括列表中的文本(Unicode)字符串在Python 2中以u为前缀而不是JS。

您还使用Django模板的默认自动转换,即HTML转义。这对于注入HTML内容是正确的,但是您要注入JavaScript,因此&#39; '会出现错误的转义。您可以通过添加|safe过滤器来避免这种情况,以避免HTML转义,但之后您根本没有转义,因此您的页面很容易受到脚本注入(跨站点脚本)的攻击。<​​/ p>

将结构化值输出到<script>块的正确方法是:

  • json.dumps将其转换为JSON字符串
  • 使用JSON字符串文字转义<替换字符串中的字符\u003C的任何实例,以便不能使用字符</script>从{转义{ {1}}阻止并注入HTML
  • 标记为安全。

您可以将这些操作合并到自定义过滤器中。不幸的是Django本身doesn't ship one

更好的方法是避免注入JavaScript。而是使用标准转义将<script>输出写入HTML文档,并使用DOM从那里读取它:

json.dumps

这使您可以将您的JS完全保留在HTML页面之外,这样您也可以使用更安全的return render(request, 'result_map.html', {'form': form, 'dat': json.dumps(dat)}) ... <body data-dat="{{ dat }}"> ... var dat= JSON.parse(document.body.getAttribute('data-dat')); 设置。