在Flask中,我们常常会选择采用RESTful设计风格,即在各个资源对应的GET、POST、PUT方法中,返回一个JSON格式的数据(资源)给前端使用。这就要求我们在(如get)方法中return一个dict,flask-restful会自动帮我们返回为一个JSON格式的数据。
而通过flask-SQLAlchemy这一ORM工具所构建的数据库表模型,通过其语句所取出的数据通常是object类型的,这一类型并不能直接在方法中return返回一个JSON格式,因此需要先对从数据库中取出的数据进行序列化,然后再return给前端。
第一种序列化方法:
使用dict在模型内部构建一个规则方法,定义资源的模式
该方法是由我们自己手动实现资源的序列化
下面就是一个完整的Model模型的构建,以及序列化实现:
from sqlalchemy import Column, Integer, String from flask_sqlalchemy import SQLAlchemy # 实例化 db = SQLAlchemy() class ArticleList(db.Model): # 设置表字段 __tablename = "article_list" id = Column(Integer, primary_key=True, autoincrement=True) title = Column(String(50), nullable=False) author = Column(String(30), nullable=True, default='未命名') descs = Column(String(1000)) img_url = Column(String(15), unique=True, nullable=True) # 序列化一条数据 @staticmethod def test_schema(book): return { 'id': book.id, 'title': book.title, 'author': book.author, 'descs': book.descs, 'img_url': book.img_url } # 查询第一条数据,并且序列化 @classmethod def get_first_one(cls): result = cls.query.first() return cls.test_schema(result)
使用:
@web.route('/web/book') def search(): result = ArticleList.get_first_one() return jsonify(result)
缺点只能序列化一条数据
序列化多条数据
from sqlalchemy import Column, Integer, String from flask_sqlalchemy import SQLAlchemy # 实例化 db = SQLAlchemy() class ArticleList(db.Model): # 设置表字段 __tablename = "article_list" id = Column(Integer, primary_key=True, autoincrement=True) title = Column(String(50), nullable=False) author = Column(String(30), nullable=True, default='未命名') descs = Column(String(1000)) img_url = Column(String(15), unique=True, nullable=True) # 序列化一条数据 @staticmethod def test_schema(book): return { 'id': book.id, 'title': book.title, 'author': book.author, 'descs': book.descs, 'img_url': book.img_url } # 查询第一条数据,并且序列化 @classmethod def get_first_one(cls): result = cls.query.first() return cls.test_schema(result) # 查询所有数据,并且返回序列化之后的 @classmethod def get_all(cls): result = cls.query.all() # 利用map函数将查询出来的数据转为dict serilaz = list(map(ArticleList.test_schema, result)) return serilaz
使用:
@web.route('/web/book/all') def book_all(): result = ArticleList.get_all() return jsonify(result)
使用keys和__getitem__序列化
class User(Base): id = Column(Integer, primary_key=True, autoincrement=True) account = Column(String(30)) _password = Column('password', String(1000), nullable=True) nickname = Column(String(50), nullable=True) status = Column(Enum('32', '16', '8'), nullable=True, default=8) def keys(self): #需要访问的属性 return ['id', 'account', 'nickname', 'status'] def __getitem__(self, item): #对象原本不支持obj['attr']类型,这样就可以支持[]访问 return getattr(self, item)
重写jsonencoder
# 重写flask的jsonify class JSONEncoder(_JSONEncoder): def default(self, o): if hasattr(o, 'keys') and hasattr(o, '__getitem__'): return dict(o) if isinstance(o,date): return o.strftime('%Y-%M-%D') raise HTTPException() class Flask(_Flask): json_encoder = JSONEncoder
发表评论
侧栏公告
寄语
譬如朝露博客是一个分享前端知识的网站,联系方式11523518。
热评文章
标签列表
热门文章
友情链接