【问题标题】:Using JSON in django template在 Django 模板中使用 JSON
【发布时间】:2011-09-11 06:53:07
【问题描述】:

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

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

这是它在模板中的显示方式:

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

知道如何让它使用 " 代替吗?

【问题讨论】:

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


    【解决方案1】:

    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)。

    【讨论】:

      【解决方案2】:

      使用SafeString:

      from django.utils.safestring import SafeString
      
      def view(request):
          ...
          return render(request, 'template.html', {'upload_params': SafeString(json_string)})
      

      【讨论】:

      • 谢谢。我意识到主要问题。当我设置变量时,python 将我的双引号更改为单引号。这就是问题的根源。对于这项服务,我需要它们是双引号。想法?
      • 我很困惑为什么这很重要...如果您使用 json 模块,它会为您安全地逃脱一切。如果你愿意,你可以将 JSON 保存为你想要的格式的字符串,只需用 SafeString 标记它并传递给模板。
      【解决方案3】:

      正如 zeekay 所说,只需使用 python 内置的 json 库。它会自动输出有效的 json 数据。您仍然需要将其标记为“安全”以供 django 在模板中使用,但您可以使用“安全”模板过滤器来做到这一点。

      【讨论】:

        【解决方案4】:

        我找到了一个使用 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
        }
        ...
        ...
        

        【讨论】:

          猜你喜欢
          • 2020-08-03
          • 2021-09-29
          • 1970-01-01
          • 2015-12-10
          • 2011-03-21
          • 2012-06-29
          • 2015-09-07
          相关资源
          最近更新 更多