Marshmallow
Marshmallow包的使用
from marshmallow import Schema, fields
def validate_data(schema: Schema, data: dict, remove_blank=False):
"""schema验证,验证成功返回数据,验证失败返回错误信息
Parameters
----------
schema:Schema: 验证规则
data: 验证数据
remove_blank : 是否去除空白字段
Returns (data,errors)
"""
d = {}
if remove_blank:
for k, v in data.items():
if v != "":
d[k] = v
else:
d = data
data, errors = schema.load(d)
if errors:
abort(400, errors)
return data
class PageSchema(Schema):
"""继承这个类,传入的数据会自动按规则进行处理"""
page = fields.Int(missing=1)
page_size = fields.Int(missing=10, validate=lambda n: 1 <= n <= 100)
created__gte = fields.Float()
created__lte = fields.Float()
page_schema = PageSchema()
class ListAPI(Resource):
def get(self):
result = validate_data(page_schema, request.args)
marshmallow-sqlalchemy
from flask import request
from flask_restful import Resource, abort, reqparse
# marshmallow-sqlalchemy 这个模块和sqlalchemy联合使用
from marshmallow_sqlalchemy import ModelSchema
from src.main import db
class TestSchema(ModelSchema):
"""首先创建一个序列化数据的类"""
class Meta:
model = Test
sqla_session = db.session
# 序列化单个数据的对象
test_schema = MailTemplateSchema()
# 序列化多个数据的对象
tests_schema = MailTemplateSchema(many=True)
class TestAPI(Resource):
def get(self):
# 下面的方法可以直接接受到request.args中的数据
# 也就是url中?后面的数据
# 可以对数据值和数据类型进行处理
parser = reqparse.RequestParser()
parser.add_argument("page", type=int, default=1, location="args")
parser.add_argument("page_size", type=int, default=10, location="args")
parser.add_argument("name", type=str, location="args")
queryset = Test.query
if merchant:
queryset = queryset.filter_by(merchant=merchant)
# sqlalchemy中自带的分页系统
pagination = queryset.paginate(page=page,per_page=page_size, error_out=False)
return {
# 查询结果总数
"count": pagination.total,
# 查询总页数
"pages": pagination.pages,
# 当前页
"page": pagination.page,
# 每页数据数
"page_size": pagination.per_page,
# 直接将数据查询结果对象序列化成字典
# 注意这里的结果是多个对象
"results":tests_schema.dump(pagination.items).data,
}
def post(self):
# 将字典反序列化为对象
test, errors=test_schema.load(request.json)
if errors:
abort(400, errors)
db.session.add(test)
db.session.commit()
return test_schema.dump(test).data