marshmallow

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值