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 method
  const 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 dictionary
    dataDictionary = [{'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 string
    dataJSON = dumps(dataDictionary)
    # pass json data to template
    return 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.mfbz.cn/a/345977.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker安装常用软件集合

大家好&#xff0c;我是豆豆&#xff0c;今天为大家带来了docker安装常用软件&#xff0c;全是干货&#xff0c;没有多余废话&#xff0c;大家点赞收藏吧&#xff0c;以防备用。 1.linux安装docker 环境安装&#xff1a; yum -y install gcc-c 第一步&#xff1a;安装必要的…

Linux命令大全(超详细版)

一 ~ 四章 【点击此处查看】 五、shell 编程 5.1、shell 概述 5.1.1 shell 是什么 Shell是一个命令行解释器&#xff0c;它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序&#xff0c;用户可以用Shell来启动、挂起、停止甚至是编写一些程序。 Shell还是…

使用Python的pygame库实现迷宫游戏

使用Python的pygame库实现迷宫游戏 关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520 先给出效果图&#xff1a; 这个游戏能自动生成迷宫布局。 在这个游戏中&#xff0c;玩家将使用键盘箭头键来移动&#xff0c;并且目标…

Sourcetree 更新git账号密码 |Sourcetree 删除git账号密码 |Sourcetree 添加git账号密码

使用Sourcetree 第一次提交代码到git或者从git拉取代码&#xff0c;有可能因为账号的问题不成功。如果提示无法连接等问题&#xff0c;大概率是账号的问题&#xff0c;这时候你就要检查Sourcetree 上的账号密码是否正确。 1.打开Sourcetree&#xff0c;打开设置&#xff0c; …

【小呆的力学笔记】弹塑性力学的初步认知三:广义胡克定律

文章目录 1.7* 广义胡克定律1.8* 广义胡克定律几种形式 1.7* 广义胡克定律 当材料处于弹性状态时&#xff0c;材料的应变和应力呈现线性关系。比如一根杆受拉伸力F作用&#xff0c;轴向会有伸长&#xff0c;同时横向会缩小&#xff0c;如下图所示。 那么有 σ x F A , ε x…

flask_apscheduler源码分析

前言 遵循flask框架的标准的库&#xff0c;称为flask扩展&#xff0c;flask_apscheduler模块就是一个flask扩展&#xff0c;它使用了flask编程上下文&#xff0c;同时内部完全依赖apscheduler。 我近期使用flask_apscheduler遇到了一个所有job全部死亡的bug。现象&#xff1a;j…

编译PCL Qt程序

使用PCL的qt程序时&#xff0c;提示不是用QVTK编译的&#xff0c;所以需要在编译VTK时打开Qt的编译选项&#xff08;由于CMakeList比较复杂&#xff0c;使用CMakeGui进行配置&#xff0c;PCL同理&#xff09;&#xff0c;编译VTK完成后&#xff0c;编译PCL也需要配置Qt支持&…

数字图像处理(实践篇)二十八 使用OpenCV Python中的K-means对图像进行颜色量化处理

目录 1 颜色量化 2 实践 在某些时候,不可避免的某些设备只能生成有限数量的颜色。因此需要执行颜色量化。选择使用cv2.kmeans()函数对颜色量化应用k-means聚类。 1 颜色量化 使用K-means聚类在图像中实现颜色量化的步骤如下: ① 导入依赖库

css文本溢出处理

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>文本溢出处理</title><style>.sing-…

基于FPGA的OFDM基带发射机的设计与实现

文章目录 前言一、OFDM描述二、本系统的实现参照 1.IEEE 802.11a协议主要参数2.不同调制方式与速率 3. IFFT映射关系4. IEEE 802.11a物理层规范5. PPDU帧格式三、设计与实现 1.扰码2.卷积编码与删余3.数据交织4.符号调制5.导频插入6.IFFT变换 7.循环前缀&加窗8.训练序列生成…

HCIA——26E-mall、MIME、POP3、IMAP、电子邮件系统的组成结构、电子邮件的发送,接收过程、MIME 与SMTP 的关系

学习目标&#xff1a; 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

沃通服务器密码机(WTHSM)

概述 沃通服务器密码机&#xff08;WTHSM&#xff09;由沃通CA自主设计开发&#xff0c;严格遵照国密局颁布技术规范&#xff0c;获得国密局颁发《商用密码产品认证证书》&#xff0c;是一款多安全功能、高稳定性、可扩展和快速部署的软硬件集成化安全设备&#xff0c;为应用提…

微服务理解篇

一 :架构演变 1 单体架构: 简单理解为一个服务涵盖所有需求功能2 垂直架构: 按照业务功能将单体架构拆分成小模块服务, 如:订单系统,用户系统,商品系统 ##缺点 引入分布式事务,分布式锁等,优点:模块解耦## 垂直拆分:根据业务层级拆分,比如商城的订单系统,用户系统,商品系统…

Fastjson代码审计实战

代码审计-漏洞复现 漏洞分析采用的是华夏ERP2.3&#xff0c; 查看pom.xml文件发现fastjson版本1.2.55&#xff0c;该版本存在漏洞&#xff0c;利用DNSlog进行验证。 fastjson涉及反序列化的方法有两种&#xff0c;JSON.parseObject()和JSON.parse()&#xff0c;在代码中直接搜…

长城资产信息技术岗24届校招面试面经

本文介绍2024届秋招中&#xff0c;中国长城资产管理股份有限公司的信息技术岗岗位一面的面试基本情况、提问问题等。 10月投递了中国长城资产管理股份有限公司的信息技术岗岗位&#xff0c;所在部门为长城新盛信托有限责任公司。目前完成了一面&#xff0c;在这里记录一下一面经…

大数据数据可视化工具ECharts,从入门到精通!

介绍&#xff1a;ECharts是一个强大的数据可视化图表库&#xff0c;它基于JavaScript开发&#xff0c;并具有丰富的特性和灵活性。 多平台支持&#xff1a;ECharts可以在PC和移动设备上流畅运行&#xff0c;它对移动端进行了优化&#xff0c;确保在不同设备上都有良好的展示效果…

【LangChain学习之旅】—(9) 用SequencialChain链接不同的组件

【LangChain学习之旅】—&#xff08;9&#xff09;用SequencialChain链接不同的组件 什么是 ChainLLMChain&#xff1a;最简单的链链的调用方式直接调用通过 run 方法通过 predict 方法通过 apply 方法通过 generate 方法 Sequential Chain&#xff1a;顺序链首先&#xff0c;…

ChatGPT+Midjourney+闲鱼赚钱方法实战探索

最近天天在朋友群内看到朋友接单(出售提示词&#xff0c;图片&#xff09;&#xff0c;轻轻松松半小时就赚200-300&#xff0c;特意探索了一下相关玩法&#xff0c;总结出一套ChatGPTMidjourney闲鱼赚钱方法&#xff0c;主打的是易上手&#xff0c;有可操作性&#xff01; 具体…

9.前端--CSS-三大特性

1.层叠性 相同选择器给设置相同的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要解决样式冲突的问题 层叠性原则: 样式冲突&#xff0c;遵循的原则是就近原则&#xff0c;哪个样式离结构近&#xff0c;就执行哪个样式样式不…

Vulnhub-dc5

靶场下载 https://download.vulnhub.com/dc/DC-5.zip 信息收集 # nmap -sn 192.168.1.0/24 -oN live.port Starting Nmap 7.94 ( https://nmap.org ) at 2024-01-21 20:56 CST Nmap scan report for 192.168.1.1 (192.168.1.1) Host is up (0.00057s latency). MAC Address:…
最新文章