我有一个包含JSON的变量,我需要传递给模板。我将其定义为变量,然后将其成功传递到模板中。但是,我需要格式用“替换引号”,但是替换为'。这会导致我将此传递给服务的问题。
image_upload_params =
{
"auth": {
"key": "xxx"
},
"template_id": "xxx",
"redirect_url": "url-here",
}
以下是模板中的内容:
{'redirect_url': 'url-here', 'template_id': 'xxx', 'auth': {'key': 'xxx'}}
任何想法如何让它使用“而不是?
答案 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)
在模板中,我们使用这样的过滤器:
...
{% 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中有更多内容)。