在django模板中使用JSON

时间:2011-06-08 22:46:43

标签: django django-templates django-template-filters

我有一个包含JSON的变量,我需要传递给模板。我将其定义为变量,然后将其成功传递到模板中。但是,我需要格式用“替换引号”,但是替换为'。这会导致我将此传递给服务的问题。

image_upload_params = 
{
  "auth": {
    "key": "xxx"
  },
  "template_id": "xxx",
  "redirect_url": "url-here",
}

以下是模板中的内容:

{'redirect_url': 'url-here', 'template_id': 'xxx', 'auth': {'key': 'xxx'}}

任何想法如何让它使用“而不是?

5 个答案:

答案 0 :(得分:14)

使用SafeString

from django.utils.safestring import SafeString

def view(request):
    ...
    return render(request, 'template.html', {'upload_params': SafeString(json_string)})

答案 1 :(得分:1)

正如zeekay所提到的,只需使用python内置的json库。它会自动输出有效的json数据。您仍然需要将django标记为“安全”才能在模板中使用,但您可以使用“安全”模板过滤器来执行此操作。

答案 2 :(得分:0)

前面的答案会打开您的程序进行XSS攻击,因为包含''的字符串将无法正确转义,从而关闭了父标记。

答案 3 :(得分:0)

我找到了一个使用django自定义模板过滤器的方法。

过滤器代码如下所示

<强> custom_filter.py

from django.template import Library
from django.utils.safestring import SafeString
import json

register = Library()


@register.filter("escapedict")
def escapedict(data):
    if not isinstance(data, dict):
        return data
    for key in data:
        if isinstance(data[key], int) and not isinstance(data[key], bool):
            data[key] = int(SafeString(data[key]))
        else:
            data[key] = SafeString(data[key])
    return json.dumps(data)

django document

在模板中,我们使用这样的过滤器:

...
{% load custom_filter %}
some html
...
onclick="jsfunc('{{data|escapedict}}')" 
...
some html
...
...
function showdetails(data){
    parse data here
}
...
...

答案 4 :(得分:0)

Django 2.1添加了json_script模板过滤器:

  

安全地将Python对象作为JSON输出,包装在标签中,可以与JavaScript一起使用

将此插入模板:

{{ value|json_script:"hello-data" }}

它呈现为:

<script id="hello-data" type="application/json">{"hello": "world"}</script>

然后,您可以安全地在JavaScript变量中加载该对象:

var value = JSON.parse(document.getElementById('hello-data').textContent);

这种方法比简单地编写var value = {{value|safe}};更安全,因为它可以保护您免受XSS攻击(this ticket中有更多内容)。