如何在 Python/Django 中将字典列表转换为 JSON?

新手上路,请多包涵

我在谷歌上搜索并找到了答案,但它对我不起作用。我必须在 Django 中将列表发送为 JsonResponse ,类似于:

 list_to_json =[{"title": "hello there",
                "link": "www.domain.com",
                "date":   ...},
               {},{},{},...]

我通过应用 StackOverflow question1question2 将其转换为 JSON,但它对我不起作用。我收到以下错误:

为了允许非 dict 对象被序列化,将 safe 参数设置为 False

这是我的代码:

     def json_response(request):
        list_to_json=[{"title": ..., "link": ..., "date": ...},{...}]
        return JsonResponse(json.dumps(list_to_json) )

原文由 shuboy2014 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 441
2 个回答
return JsonResponse(list_to_json, safe=False)

看看 文档

safe 布尔参数默认为 True。如果它设置为 False,则可以传递任何对象进行序列化(否则只允许 dict 实例)。如果 safe 为 True 并且将非字典对象作为第一个参数传递,则会引发 TypeError 。

原文由 Adam Hopkins 发布,翻译遵循 CC BY-SA 3.0 许可协议

为任何想知道为什么默认情况下这不是“安全”的人添加这个答案。将非字典数据结构打包到响应中会使服务容易受到 ES5 之前的 JSON 劫持攻击。

基本上,对于您在此处使用的 JSONResponse,如果用户通过了您网站的身份验证,他现在可以检索该 {title, link, date} 对象列表,这很好。但是,攻击者可以将该端点作为脚本源包含在他自己的恶意页面中(跨站点脚本包含,又名 XSSI):

 <script src="https://www.yourwebsite.com/secretlinks/"></script>

然后,如果毫无戒心的经过身份验证的用户导航到恶意页面,浏览器将在不知不觉中从您的站点请求数据数组。由于您的服务只是返回一个未分配的数组,攻击者还必须中毒 js 数组构造函数(这是 ES5 中修复的攻击的一部分)。 _在 ES5 之前_,攻击者可以像这样简单地覆盖 Array 构造函数:

 Array = function() {secret = this;}

现在 secret 包含您的词典列表,并且可用于攻击者脚本的其余部分,他可以在其中将其发送到他自己的服务器。 ES5 通过强制使用由默认 Array 构造函数计算的括号来修复此问题。

为什么这不是字典对象的问题?仅仅是因为 javascript 中的花括号表示一个孤立的范围,所以攻击者无法将自己的代码注入到由返回的字典创建的范围中,该范围由花括号包围。

更多信息在这里: https ://security.stackexchange.com/questions/159609/how-is-it-possible-to-poison-javascript-array-constructor-and-how-does-ecmascrip?newreg=c70030debbca44248f54cec4cdf761bb

原文由 stackPusher 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题