Flask序列化
我们在做后台接口的时候,对于返回值,用的最多的就是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序列化的更多相关文章
- flask基础之安装和使用入门(一)
前言 Flask框架作为一个python极简化的web框架,它不像Django那样的重型,非常适合快速开发一些小型的应用.本人用flask开发了几个项目之后,慢慢研究flask底层的一些原理,开始一步 ...
- python flask model 序列化
class DictSerializable(object): def as_dict(self,*args): result = OrderedDict() ...
- Flask备注二(Configurations, Signals)
Flask备注二(Configuration, Signals) Flask是一个使用python开发Web程序的框架.依赖于Werkzeug提供完整的WSGI支持,以及Jinja2提供templat ...
- Python之路-python(装饰器、生成器、迭代器、Json & pickle 数据序列化、软件目录结构规范)
装饰器: 首先来认识一下python函数, 定义:本质是函数(功能是装饰其它函数),为其它函数添加附件功能 原则: 1.不能修改被装饰的函数的源代码. 2.不 ...
- Flask Restful Small Demo
参考: http://www.pythondoc.com/flask-restful/first.html 什么是Rest Client-Server:服务器端与客户端分离. Stateless(无状 ...
- 【转】Flask快速入门
迫不及待要开始了吗?本页提供了一个很好的 Flask 介绍,并假定你已经安装好了 Flask.如果没有,请跳转到 安装 章节. 一个最小的应用 一个最小的 Flask 应用看起来会是这样: from ...
- Flask jQuery ajax
http://www.runoob.com/jquery/jquery-ref-ajax.html http://jun1986.iteye.com/blog/1399242 下面是jQuery官方给 ...
- Flask的session——关于写扩展所学习到的
这两天端午节.趁着端午节没事干,写了个flask的扩展--flask-RedisSession 在flask中使用该扩展可以让你借助redis数据库轻松获得server-side session. 这 ...
- flask 扩展之 -- flask-login
一. 使用 Werkzeug 实现密码散列. generate_password_hash(password, method=pbkdf2:sha1, salt_length=8) 将原始密码作为输入 ...
随机推荐
- Spark GraphX快速入门
GraphX是Spark用于图形并行计算的新组件.在较高的层次上,GraphX通过引入一个新的Graph抽象来扩展Spark RDD:一个定向的多图,其属性附加到每个定点和边.为了支持图计算,Grap ...
- java单元测试
单元测试 1.简介 在日常开发中,我们编写的任何代码都需要经过严谨的测试才可以发布.以往的测试方法都是通过编写一个main函数进行简单的测试,并使用大量的print语句输出结果,这种方法其实是不可取的 ...
- UIWebView的高度不对问题
一般情况,在- (void)webViewDidFinishLoad:(UIWebView *) webView方法里添加如下代码: CGSize actualSize = [webView size ...
- IO测试工具之fio详解
目前主流的第三方IO测试工具有fio.iometer和Orion,这三种工具各有千秋. fio在Linux系统下使用比较方便,iometer在window系统下使用比较方便,Orion是oracle的 ...
- 远程桌面连接一台关联无线的电脑(A)时,A电脑无线总是断开导致远程桌面连接失败
1. 我的环境: 两台电脑,分别记为PC1和PC2,PC1有线或者无线连在路由器上,PC2无线连在同一个路由器上.(当然,我的PC1是win10系统,PC2是win7系统) 2. PC1只要一远程连 ...
- 第10章 嵌入式Linux 的调试技术
10.1 打印内核调试信息:printk printk位函数运行在内核空间, printf函数运行在用户空间.也就是说,像Linux 驱动这样的Linux内核程序只能使用printk函数输出调试信息 ...
- JSP(一):初识JSP
在Servlet中,我们多次用到了jsp页面,今天就来仔细聊聊JSP. 一.概念 JSP全名是Java Server Pages,可理解为Java服务端页面,是一种动态网页开发技术,其本质是一个简化的 ...
- js中split()方法得到的数组长度
js 中split(",")方法通过 ”,“ 分割字符串, 如果字符串中没有 “,” , 返回的是字符串本身 var str = “abc”://分隔符个数为0 var newSt ...
- 我的游戏学习日志3——三国志GBA
我的游戏学习日志3——三国志GBA 三国志GBA由日本光荣公司1991~1995所推出<三国志>系列游戏,该作是光荣在GBA上推出的<三国志>系列作品的第一款.本游戏登场武将总 ...
- 【Teradata】日期类型计算
1.EXTRACT(抽取年/月/日/时/分/秒) //抽取年/月/日/时/分/秒 SELECT EXTRACT (YEAR FROM CURRENT_DATE); SELECT EXTRACT (M ...