三种序列化方法
在网络上找到的三种序列化方法如下:
- 在模型定义的时候给序列化的方法
- 继承改写 flask 里面的 JSONEncoder类以及default方法
- 使用Marshmallow
为什么要进行序列化(将数据库取出的对象转化为JSON格式)
在Flask中,我们常常会选择采用RESTful设计风格,即在各个资源对应的GET、POST、PUT方法中,返回一个JSON格式的数据(资源)给前端使用。这就要求我们在(如get)方法中return一个dict,flask-restful会自动帮我们返回为一个JSON格式的数据。
而通过flask-SQLAlchemy这一ORM工具所构建的数据库表模型,通过其语句所取出的数据通常是object类型的,这一类型并不能直接在方法中return返回一个JSON格式,因此需要先对从数据库中取出的数据进行序列化,然后再return给前端。
第一种序列化方法:使用dict在模型内部构建一个规则方法,定义资源的模式
该方法是由我们自己手动实现资源的序列化
下面就是一个完整的Model模型的构建,以及序列化实现:
class Test(db.Model):
# 表的字段构建
id = db.Column(db.BIGINT, primary_key=True, autoincrement=True)
station_id = db.Column(db.String(20), nullable=False)
datetime = db.Column(db.DateTime, nullable=False)
m0 = db.Column(db.Float)
# 模型的资源序列化函数(方法)
# 在该函数中所返回的dict的keys,将是我们从test表里所序列化的字段
def test_schema(self):
return {
'id': self.id,
'station_id': self.station_id,
'datetime': self.datetime,
'm0': self.m0
}
上述代码便完成了准备工作,下面我们将展示如何应用,即在RESTful API中以JSON格式返回数据库表中取得的数据:
class HelloWorld(Resource):
def get(self):
data = Test.query.first() # 取第一条数据
data_serialize = data.test_schema() # 通过我们之前在模型类里定义的序列化函数对取得数据进行序列化,此时 data_serialize 的类型是 dict
return jsonify(data_serialize)
以上就是第一种序列化方法的实现过程
给出完整代码:
from flask import Flask as _Flask
from flask import jsonify
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
from flask_restful import Api, Resource
from flask_marshmallow import Marshmallow
app = _Flask(__name__)
api = Api