Django、Flask 与 Javascirpt 之间传值与数据转换

常见问题:JavaScript 如何处理Django、Flask传递的数据库数据

Django 、Flask从数据库读出的数据通常保存为:对象列表、字典列表,或 tuple列表形式

# 用object_list 对象列表表示数据库记录
[<Article: id=1,title=星际穿越影评,body=作为一部硬科幻电影,..., ck=False>, <Article: id=2,title=流浪地球,body=《流浪地 球》该部影片..., ck=False>, <Article: id=3,title=海的尽头是草原,body=无论处在多么艰难的时..., ck=False>, <Article: id=4,title=我们的岁月,body=想看看时代的缩影,结..., ck=False>
]
# 用 字典列表来表示数据库记录
[{'id': 1, 'title': '星际穿越影评', 'ck': False}, {'id': 2, 'title': '流浪地球', 'ck': False}, {'id': 3, 'title': '海的 尽头是草原', 'ck': False}, {'id': 4, 'title': '我们的岁月', 'ck': False}
]
# 以tuple 列表,或二维列表,表示数据库记录
[(1, '星际穿越影评', False), (2, '流浪地球', False), (3, '海的尽头是草原', False), (4, '我们的岁月', False), 
]

有时,我们需要使用Javascript的功能,比如使用 echarts 库进行绘图, 或者为了减轻服务器压力只返回原始数据给浏览器,在本地通过 assembly 或javascript 进行数据处理,等场景下,在javascript 端需要对收到的数据转换为javascript 易于处理的格式。

本文将介绍Django/Flask 数据库Web应用中后端传值,以及前端javascript处理的最佳实践

  • Django/Flask 应该以什么格式传递数据库记录数据
  • 在前端 Javascript 中如何接收以及转换数据

在这里插入图片描述

1、区分python中dict与json, js中 object与json区别,以及转换

1.1 python中dict与json区别

什么是 json ?
json的定义javascript object notation, 是javascript 用以文本格式进行网络交换数据、或存储数据的格式。

什么是dict?
dict字曲类型是python 原生类型,主要用于in-memory 的数据描述,不能直接用于存储或网络数据交换。

二者区别

  • 在python中, json 类型是str, 虽然也是用 { key:value } 形式,但”key“必须是双引号,value可以是任意数据类型。integer, str, list, array 等。
  • dict 类型,dict是原生类型,不是字符串. 形式上也是key: value,但key可以双引号,也可用单引号括起来。
  • json格式可以直接写入文件、通过网络接口传递,而dict类型不能直接写入文件,必须转为json或 str,才可以。

dict 与json转换
dict => json :

x_dict = {"name": "John","age": 30,"city": "New York"
}
y_json = json.dumps(x_dict)

json => dict

y_json = '{"name":"John", "age":30, "city":"New York"}'
# 注意 key必须用"双引号“括起来,外面再用单引号括起来
x_dict = json.loads(y_json)

1.2 javascript 中,json与object的区别

什么是object?
object 是 javascript 的原生类型,也是所有类型的原始类型,但同样也不能直接用于网络传输数据。 形式上,key不能用引号括起来。

var  x = new Object;
x.name = "John"
x.age = 20
console.log(x)

ouput

{ name: 'John', age: 20 }

json in javascript
json 在javascript中,形式上也是string类型,但 key必须用双引号括起来 “key”, 因此json字符串外层只能用单引号括起来

const jsonText = `{"browsers": {"firefox": {"name": "Firefox","pref_url": "about:config","releases": {"1": {"release_date": "2004-11-09","status": "retired","engine": "Gecko","engine_version": "1.7"}}}}}`;console.log(JSON.parse(jsonText));

output

{browsers: {firefox: { name: 'Firefox', pref_url: 'about:config', releases: [Object] }}
}

二者区别
形式上,

  • json 字符串外层用单引号括起来, “key” 用双引号,value为任意类型. vlue与冒号:之间无空格
  • object 外层无引号, key也不用括起来, value与冒号;之间有空格。

json与object转换

json => object: 用JSON.parse()方法

  // parse methodconst x_json = '{"name":"John", "age":30, "city":"New York"}'const y_obj = JSON.parse(x_json)console.log(x_json)console.log(y_obj)

ouput:

{"name":"John", "age":30, "city":"New York"}
{ name: 'John', age: 30, city: 'New York' }

注意 object r value 与: 之间有空格。

object => json : 用JSON.stringify()

  var z_obj = { x: 10, y: 100}var q_json=JSON.stringify(z_obj)console.log(z_obj)console.log(q_json)

output

{ x: 10, y: 100 }
{"x":10,"y":100}

Object 的key可以省略, 就类似于python 列表, 所以django可以直接将列表传为json传值

q_json  = JSON.stringify([new Number(3), new String('false'), new Boolean(false)]),
console.log(q_json);
z_obj = JSON.parse(q_json)
console.log(typeof(z_obj),Object.keys(z_obj))

output

{ x: 10, y: 100 }
{"x":10,"y":100}
[3,"false",false]
object [ '0', '1', '2' ]

2. Django/Flask传值给 javascript 的处理

2.1 django 传值给用户浏览器

由于dict不能直接用于网络间数据交换,因此django 须先将字典转换成 json 格式
由于object 对象也不能直接用于网络接口,必须经序列化,但这样做的话,在javascript侧解析就比较麻烦。建议将数据库记录使用字典列表的格式,再转为json字符串,发送给模板,或直接用 HttpResponse返还给用户浏览器。

2.2 django传值给模板

视图传值给模板文件,实际上还是django内部流程, 所以可以直接用字典、字典列表传值,模板子系统{{{ x_dict }} 收到后,也是会转为html数据后才发送出去。 这种方式,模板中没有使用javascript 时,可以这样做。
Flask使用Jinjia2模板,处理是相同的。

2.3 django传值给模板 javascript

如果模板中包含了 javascript 代码,并需要对视图传递的数据进行处理,则视图不应该直接传递字典、字典列表,应先将字典列表数据转为json, 再传递给模板,如下例, 传递了书籍列表数据给模板

## views.py 
from django.shortcuts import render 
from json import dumps def send_dictionary(request):# create data dictionarydataDictionary = [{'id': 1, 'title': '星际穿越影评', 'ck': False}, {'id': 2, 'title': '流浪地球', 'ck': False}, {'id': 3, 'title': '海的 尽头是草原', 'ck': False}, {'id': 4, 'title': '我们的岁月', 'ck': False}, {'id': 6, 'title': 'Title_Test_a002', 'ck': False}, {'id': 7, 'title': 'Title_Test_a003', 'ck': False}, {'id': 8, 'title': 'Title_Test_a004', 'ck': False}, {'id': 9, 'title': 'A005', 'ck': False}, {'id': 10, 'title': 'A006', 'ck': False}, {'id': 11, 'title': 'A009', 'ck': False}, {'id': 12, 'title': 'A0010', 'ck': False}]# dump data to json stringdataJSON = dumps(dataDictionary)# pass json data to templatereturn render(request, 'main / landing.html', {'data': dataJSON})

javascript {{ x_json | safe }} 接收后,再用 JSON.parse()转换为object对象后处理。

<!-- templates.html 文件 -->
<!-- 以上省略  --> 
<script> // convert json ⇒> object , 第1层为数组var data = JSON.parse("{{data|escapejs}}"); for (var i=0; i < data.length; i++){let txt = Object.values(data[i]).join(",")console.log(txt)}
</script>

output like

1,星际穿越影评,false
2,流浪地球,false
3,海的 尽头是草原,false
4,我们的岁月,false
6,Title_Test_a002,false
7,Title_Test_a003,false
8,Title_Test_a004,false
9,A005,false
10,A006,false
11,A009,false
12,A0010,false

说明:

  • 在django侧的原始数据,是常用的字典列表,将其转为json后传给template中的javascript.
  • 在javascript 代码部分,用 {{ data | escapejs}} 获取json数据,然后用parse() 很方便地将数据转为 object元素构成的数组,
  • 用for循环遍历数组,每个objet元素,将其所有属性值拉出来,拼接成字符串显示出来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/645811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式linux学习之实践操作

# 前沿 ##1. 安装交叉编译器 * 在 开发板光盘 A- 基础资料 ->5 、开发工具 ->1 、交叉编译器 路径下找到 st-example-image-qt wayland-openstlinux-weston-stm32mp1-x86_64-toolchain-3.1-snapshot.sh 。将它拷贝到 Ubuntu 虚拟机上。 拷贝到 Ubuntu 后&#xff0…

oracle19.22的patch已发布

2024年01月16日,oracle发布了19.22的patch 具体patch如下 Reserved for Database - Do not edit or delete (Doc ID 19202401.9) 文档ID规则如下 19(版本)+年份(202x)+(季度首月01,04,07,10).9 往期patch no信息和下载参考文档 oracle 19C Release Update patch num…

【Leetcode】2865. 美丽塔 I

文章目录 题目思路代码结果 题目 题目链接 给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。 你的任务是在坐标轴上建 n 座塔。第 i 座塔的下标为 i &#xff0c;高度为 heights[i] 。 如果以下条件满足&#xff0c;我们称这些塔是 美丽 的&#xff1a; 1 < hei…

【Web前端实操11】定位实操_照片墙(无序摆放)

设置一个板块&#xff0c;将照片随意无序摆放在墙上&#xff0c;从而形成照片墙。本来效果应该是很唯美好看的&#xff0c;就像这种&#xff0c;但是奈何本人手太笨&#xff0c;只好设置能达到照片墙的效果就可。 代码如下&#xff1a; <!DOCTYPE html> <html lang&…

uniapp+vue3+ts--编写微信小程序对接e签宝签署时跳转刷脸效果(人脸识别)中间页代码

uniappvue3ts–编写微信小程序对接e签宝签署时跳转刷脸效果&#xff08;人脸识别&#xff09;中间页代码 e签宝内嵌H5方式集成签署页的文档说明&#xff1a;https://open.esign.cn/doc/opendoc/case3/ahb0sg 签署时跳转刷脸效果示意图&#xff1a; 1. 在文件夹新建一个文件&a…

配网行波型故障预警定位装置:电力系统的安全守护神

随着科技的不断发展&#xff0c;电力系统的运行和管理已经越来越依赖于先进的技术手段。在这个领域中&#xff0c;配网行波型故障预警定位装置(也被称为智能电网监测设备)已经成为了一种重要的技术装备。它能够实时监测电力系统的运行状态&#xff0c;及时发现并预警故障&#…

服务器和云桥通SDWAN组网的区别

一、服务器的概念 服务器是一种计算设备&#xff0c;用于存储、处理和提供数据和应用服务。通常&#xff0c;服务器配备高性能处理器、大容量存储器和网络接口&#xff0c;其主要目的是提供计算资源、存储资源以及应用程序的托管。这种设备可以用于托管网站、应用程序、数据库和…

游泳耳机哪个牌子好?2024年游泳耳机热门榜单分享

在水中畅游的时光&#xff0c;总是需要一位默契的伴侣&#xff0c;而优秀的游泳耳机正是这段旅程中的完美音乐搭档。近年&#xff0c;游泳耳机市场上涌现了一批备受瞩目的明星产品&#xff0c;它们不仅拥有卓越的防水性能&#xff0c;更以出色的音质和贴合度征服了游泳爱好者的…

gitlab备份-迁移-升级方案9.2.7升级到15版本最佳实践

背景 了解官方提供的版本的升级方案 - GitLab 8: 8.11.Z 8.12.0 8.17.7 - GitLab 9: 9.0.13 9.5.10 9.2.7 - GitLab 10: 10.0.7 10.8.7 - GitLab 11: 11.0.6 11.11.8 - GitLab 12: 12.0.12 12.1.17 12.10.14 - GitLab 13: 13.0.14 13.1.11 13.8.8 13.12.15 - G…

JVM实战(34)——内存溢出之消息队列处理不当

一、简介 本章&#xff0c;我们将介绍一个因为处理消息队列中的数据不当而引起的内存溢出问题&#xff0c;先来看下系统的背景。 1.1 系统背景 这是一个线上的数据同步系统&#xff0c;专门从Kafka消费其它系统送进去的数据&#xff0c;处理后存储到自己的数据库中&#xff1…

java——运算符

目录 &#x1f388;算数运算符 1. 基本四则运算符 2.增量运算符 3.自增/自减运算符 &#x1f388;关系运算符 ❗逻辑运算符(重点) &#x1f6a9; 逻辑与 && &#x1f6a9;逻辑 || &#x1f6a9;逻辑非 ! &#x1f6a9;短路求值——java &#x1f388;位运算…

使用frp透传软件搭建本地运行的私有邮箱服务器

起因&#xff1a;随着我公司在线应用软件的增多&#xff0c;比如wordpress、 next cloud、SuitCRM 、iFair等&#xff0c;许多场合都要求填写邮箱地址&#xff0c;绑定邮箱。因为不想将过多的数据存储于第三方空间&#xff0c;因此考虑在公司局域网内搭建一个私有的电子邮箱服务…

初识计算机网络 | 计算机网络的发展 | 协议初识

1.计算机网络的发展 “矛盾是普遍存在的&#xff0c;矛盾是事物联系的实质内容和事物发展的根本动力&#xff01;” 计算机在诞生之初&#xff0c;在军事上用来计算导弹的弹道轨迹&#xff01;在发展的过程中&#xff08;商业的推动&#xff0c;国家政策推动&#xff09;&…

ChatGLM论文解读

GLM GLM: General Language Model Pretraining with Autoregressive Blank Infilling 论文地址 1. 背景介绍 1)主流预训练框架 模型介绍结构特点训练目标autoregressive自回归模型,代表GPT,本质上是一个从左到右的语言模型,常用于无条件生成任务(unconditional generat…

composer安装hyperf后,nginx配置hyperf

背景 引入hyperf项目用作微服务&#xff0c;使用composer 安装hyperf后&#xff0c;对hyperf进行nginx配置。 配置步骤 因为hyperf监听的是端口&#xff0c;不像其他laravel、lumen直接指向文件即可。所有要监听端口号。 1 配置nginx server {listen 80;//http&#xff1a…

如何使用宝塔面板配置Nginx反向代理WebSocket(wss)

本章教程&#xff0c;主要介绍一下在宝塔面板中如何配置websocket wss的具体过程。 目录 一、添加站点 二、申请证书 三、配置代理 1、增加配置内容 2、代理配置内容 三、注意事项 一、添加站点 二、申请证书 三、配置代理 1、增加配置内容 map $http_upgrade $connection_…

【算法Hot100系列】不同路径

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

LIMS源码,实验室信息系统源码,后端框架:asp.net

LIMS(laboratory information management system)即实验室信息管理系统是实验室管理科学发展的成果&#xff0c;是实验室管理科学与现代信息技术结合的产物&#xff0c;是利用计算机网络技术、数据存储技术、快速数据处理技术等&#xff0c;对实验室进行全方位管理的计算机软件…

【Linux】糟糕,是心动的感觉——与Linux的初次相遇

初识Linux 导言一、计算机的发展1.1 历史背景1.2 计算机的发明 二、操作系统2.1 什么是操作系统&#xff1f;2.2 操作系统的诞生2.3 操作系统的发展2.3.1 批处理系统的发展2.3.2 分时系统2.3.3 实时系统2.3.4 通用操作系统 2.4 UNIX操作系统2.4.1 UNIX的诞生2.4.2 UNIX的发展 2…

开源 C/C++(DuckX)操作docx文旦

目录 1.详情 2.项目示例 1.详情 创建、读取和写入 Microsoft Office Word docx 文件&#xff0c;可以不使用Microsoft Office组件。目前看操作docx文件绕不开Microsoft Office组件&#xff0c;虽然本项目可以读取docx文档&#xff0c;但是里面排版都消失了&#xff0c;除此之…