我们在做后台接口的时候,对于返回值,用的最多的就是json数据格式。
(视频教程推荐:)
flask中,返回json数据格式,我们可以用到flask的jsonify函数。
对于基础序列是可以直接序列化的,但是更多的情况下,我们要返回给前端的是一个从数据库查询的模型对象。那么要如何序列化一个模型对象呢?
追踪flask源码,我们会发现,在处理特殊类型的数据的时候,flask用到了json包下的一个JSONEncoder类,它里面有一个很重要的函数,default(),这里面对datetime,date,uuid,html等都做了特殊处理,但是没有对模型对象做处理。
所以思路就出来了,我们需要重写JSONEncoder的default函数,想办法将模型对象转化为dict类型,这样jsonify就可以直接处理了。
那么如何处理模型对象?
最开始想到的是,是用模型对象的__dict__属性,但是这个属性中只有实例属性,没有类属性,所以显然用这个不可取的。
又想到我们平时要定义一个字典类型,是怎么处理的?
可以使用d = dict() 函数来创建一个字典类型的变量。
那如果我们将模型对象实例作为参数传递给dict() 是否可行呢?
答案是可行的,但是我们需要在模型对象中定义两个方法,keys()方法和__getitem__()方法
keys()方法返回值为一个序列,用于告诉dict,当前dict()的key值
__getitem__() 方法,用于将key值和value值对应起来返回给dict()
所以,flask中,如何序列化模型对象呢?答案就呼之欲出了。直接上代码
如上图,定义类JsonEncode,继承自flask.json下面的JSONEncoder,然后重写里面的default函数,其他的不变,唯一就是增加模型对象的序列化,
判断如果当前对象中存在keys和__getitem__属性(即我们上面自定义的两个方法),则表示是模型对象,把它作为参数传给dict(),
然后将我们顶一个JsonEncoder函数替换掉flask.json下面的JSONEncoder类。
最后在需要序列化的模型下面定义keys()和__getitem__()方法。
相关教程推荐:
育乐教育网还为您提供以下相关内容希望对您有帮助:
在flask中使用jsonify和json.dumps的区别
return current_app.response_class(json.dumps(dict(*args, **kwargs),indent=None if request.is_xhr else 2), mimetype='application/json')可以看出jsonify实际上也是使用了json.dumps来序列化json形式的数据,作为响应正文返回。indent表示json格式化的缩进,若是Ajax请求则不缩进(因为一般Ajax数据...
如何在后台部署深度学习模型
为了将图像存储在Redis中,需要对它们进行序列化。由于图像只是数字数组,我们可以使用base64编码来序列化图像。使用base64编码还有一个额外的好处,即允许我们使用JSON存储图像的附加属性。 base64_encode_image函数处理序列化。类似地,在通过模型传递图像之前,我们需要反序列化图像。这由base64_decode_image函数处理。 预...
Flume+Kafka+Flink+Redis构建大数据实时处理系统(PV、UV)
在我们的场景中,两个Flume Agent分别部署在两台Web服务器上,用来采集Web服务器上的日志数据,然后其数据的下沉方式都为发送到另外一个Flume Agent上,所以这里我们需要配置三个Flume Agent。对于Kafka而言,关键在于如何接收来自Flume的数据。从整体上讲,逻辑应该是比较简单的,即可以在Kafka中创建一个用...
tornado实现session
一般session数据保存有以下几种方式: 1.直接存储在cookie(服务器端不保存),例如flask中,默认的session是经过加密保存在cookie中的.2.在cookie中保存一个session_id,然后在服务器端通过session_id查询该cookie.现在基于第二种在tornado中实现session.首先拿一个dict来存储session_id和对应的数据.然后实现...
Python用内置模块来构建REST服务、RPC服务
对于客户端,Python提供了urllib.request模块进行基本的HTTP操作,如GET和POST请求,也可以借助requests库提供更丰富的功能。对于更复杂的RPC调用,Python支持XML-RPC和multiprocessing模块,它们允许在不同进程间进行数据交换,但需要注意安全问题,如异常处理和数据序列化。总的来说,Python的内置模块为构建REST...
有了处理excel数据的R语言代码如何应用?
它们是从数据中获得有用的见解并通过建立预测模型解决问题所需的技能。 从形式上来讲,这就是两者的定义方式。 数据科学是从数据中提取有用信息以解决实际问题的过程。 机器学习是使机器学习如何通过提供大量数据来解决问题的过程。 这两个域是高度互连的。 机器学习是数据科学的一部分,它利用ML算法和其他统计技术来...
HTTP 与 RPC 接口区别
3. 应用场景HTTP 接口适用于Web应用和浏览器间的通信,如API服务。RPC 接口常用于分布式系统,如高并发处理和大数据。4. 技术发展趋势HTTP 面向 GraphQL 等新查询语言,提升数据传输效率。gRPC 作为高性能 RPC 框架,优化了序列化和通信性能。5. 开发工具HTTP开发常用Flask、Express等框架,以及Apifox、...
Jmeter 接口测试-请求 Headers 与传参方式
1. application/x-www-form-urlencoded,这是最常见的POST数据提交方式,若不设置Headers的content-type,则默认以application/x-www-form-urlencoded方式提交数据。2. application/json,它被越来越多地用作请求头,用于告知服务端消息主体为序列化的JSON字符串。这种方案特别适用于RESTful接口,提供复杂结构...
Python常见的漏洞都有什么?
其次是SQL注入漏洞。SQL注入漏洞的原因是用户输入直接拼接到SQL查询语句中。在pythonweb应用程序中,orm库一般用于数据库相关的操作。例如,Flask和Tornado经常使用SQLAlchemy,而Django有自己的orm引擎。.但是如果不使用ORM,直接拼接SQL语句,就有SQL注入的风险。再者是输入函数漏洞。在Python2的大量内置特性中...
值得收藏的Python第三方库
pickleDB – 一个简单,轻量级键值储存数据库。PipelineDB – 流式 SQL 数据库。TinyDB – 一个微型的,面向文档型数据库。ZODB – 一个 Python 原生对象数据库。一个键值和对象图数据库。Web 框架 全栈 web 框架。Django – Python 界最流行的 web 框架。awesome-django系列 Flask – 一个 Python ...