【Python】Marshmallow:Python中的“棉花糖”

article/2025/10/31 5:09:00

在这里插入图片描述

博主:👍不许代码码上红
欢迎:🐋点赞、收藏、关注、评论。

文章目录

    • 一、Marshmallow简介
      • 1.1、基础概念
    • 二、序列化
      • 2.1、User类
      • 2.2、UserSchema类
      • 2.3、Serializing(序列化)
      • 2.4、运行
      • 2.5、过滤输出
    • 三、反序列化
    • 四、验证数据
      • 4.1、Validation
      • 4.2、自定义验证错误提示
      • 4.3、自定义验证错误提示原因
      • 4.4、将验证函数写在Schema中变成验证方法
    • 五、排序

一、Marshmallow简介

1.1、基础概念

第一点
marshmallow是一个用来将复杂的orm对象与python原生数据类型之间相互转换的库,简而言之,就是实现object -> dict,objects -> list, string -> dict 和string -> list。

第二点
Flask-Marshmallow包含用于集成的有用附加功能Flask-SQLAlchemy和 marshmallow-sqlalchemy。要启用SQLAlchemy集成,请确保同时安装了Flask-SQLAlchemy和marshmallow-sqlalchemy。

二、序列化

序列化:序列化的意思是将数据对象转化为可存储或可传输的数据类型
反序列化:将可存储或可传输的数据类型转化为数据对象

2.1、User类

要进行序列化或反序列化,首先我们需要一个用来操作的object,这里我们先定义一个类

class User:def __init__(self, name, email):self.name = nameself.email = emailself.created_time = dt.datetime.now()

在这里插入图片描述

2.2、UserSchema类

要对一个类或者一个json数据实现相互转换(即序列化和反序列化), 需要一个中间载体,这个载体就是Schema,另外Schema还可以用来做数据验证。

class UserSchema(Schema):name = fields.String()email = fields.Email()created_time = fields.DateTime()

2.3、Serializing(序列化)

dump():scheme的dump()方法来序列化对象,返回的是dict格式的数据

dumps():schema的dumps()方法序列化对象,返回的是json编码格式的字符串

user = User("小明","123456")
schema = UserSchema()
res = schema.dump(user)
res2 = schema.dumps(user)
print(type(res))
print(res)
print(type(res2))
print(res2)

2.4、运行

在这里插入图片描述

2.5、过滤输出

当不需要输出所有的字段时,可以在实例化Scheme时,声明only参数,来指定输出

summary_schema = UserSchema(only={"name","email"})
res = summary_schema.dump(user)
print(res)

在这里插入图片描述

三、反序列化

每次调用load()方法时, 会按照make_user的逻辑, 返回一个User类对象
注意:def make_user(self, data,**kwargs)
代码

import datetime as dtfrom marshmallow import Schema, fields, post_loadclass User:def __init__(self, name, email):self.name = nameself.email = emailself.created_time = dt.datetime.now()class UserSchema(Schema):name = fields.String()email = fields.Email()created_time = fields.DateTime()
#dict->object()@post_loaddef make_user(self, data,**kwargs):return User(**data)user_data = {"name": "lhh","email": "2432783449@qq.com",# "created_time": "2022-09-08T21:34:34.443495"
}schema = UserSchema()
res = schema.load(user_data)
print(res)
user = res
print("name: {}    email: {}".format(user.name, user.email))

在这里插入图片描述

四、验证数据

4.1、Validation

当不合法的数据通过Schema.load()或者Schema.loads()时,会抛出一个 ValidationError 异常。ValidationError.messages属性有验证错误信息,验证通过的数据在 ValidationError.valid_data 属性中 我们捕获这个异常,然后做异常处理。
创建一个validation.py,代码如下

from marshmallow import Schema,fields,ValidationErrorclass UserSchema(Schema):name = fields.String()email = fields.Email()created_time = fields.DateTime()try:res = UserSchema().load({"name":"王小明","email":"123"})except ValidationError as e:print(f"错误信息:{e.messages}  合法数据:{e.valid_data}")'''当验证一个数据集合的时候,返回的错误信息会以 错误序号-错误信息 的键值对形式保存在errors中
'''
user_data = [{'email': '123456@qq.com', 'name': '王小明'},{'email': '123', 'name': '王小明'},{'name': '王小明'},{'email': '123@qq.com'},
]try:schema = UserSchema(many=True)res = schema.load(user_data)print(res)
except ValidationError as e:print("错误信息:{}   合法数据:{}".format(e.messages, e.valid_data))

在这里插入图片描述

4.2、自定义验证错误提示

from marshmallow import Schema,fields,ValidationErrorclass UserSchema(Schema):name = fields.String(required=True, validate=lambda s:len(s) < 6)email = fields.Email()created_time = fields.DateTime()user_data = {"name":"","email":"123@qq.com"}
try:res = UserSchema().load(user_data)
except ValidationError as e:print(e.messages)

当名字长度小于6时无报错信息
user_data = {“name”:“王小明”,“email”:“123@qq.com”}

在这里插入图片描述
当名字长度大于6时
user_data = {“name”:“王小明爱看电影”,“email”:“123@qq.com”}

在这里插入图片描述

4.3、自定义验证错误提示原因

user_data = {“name”:“王”,“email”:“123@qq.com”}

from marshmallow import Schema,fields,ValidationErrordef validate_name(name):if len(name) <=2:raise ValidationError("name长度必须大于2位")if len(name) >= 6:raise ValidationError("name长度不能大于6位")class UserSchema(Schema):name = fields.String(required=True, validate=validate_name)email = fields.Email()created_time = fields.DateTime()user_data = {"name":"","email":"123@qq.com"}
try:res = UserSchema().load(user_data)
except ValidationError as e:print(e.messages)

在这里插入图片描述

4.4、将验证函数写在Schema中变成验证方法

 @validates("name")def validate_name(self, value):if len(value) <= 2:raise ValidationError("name长度必须大于2位")if len(value) >= 6:raise ValidationError("name长度不能大于6位")
from marshmallow import Schema, fields, ValidationError, validatesclass UserSchema(Schema):name = fields.String(required=True)email = fields.Email()created_time = fields.DateTime()@validates("name")def validate_name(self, value):if len(value) <= 2:raise ValidationError("name长度必须大于2位")if len(value) >= 6:raise ValidationError("name长度不能大于6位")user_data = {"name":"王","email":"123@qq.com"}
try:res = UserSchema().load(user_data)
except ValidationError as e:print(e.messages)

在这里插入图片描述

五、排序

对于某些用例,维护序列化输出的字段顺序可能很有用。要启用排序,请将ordered选项设置为true。这将指示marshmallow将数据序列化到collections.OrderedDict

from collections import OrderedDict
import datetime as dt
from marshmallow import fields,Schemaclass User:def __init__(self, name, email):self.name = nameself.email = emailself.created_time = dt.datetime.now()class UserSchema(Schema):# uppername = fields.Function(lambda obj: obj.name.upper())class Meta:fields = ("email","name", "created_time")ordered = Trueuser = User("王小明", "123@qq.com")
schema = UserSchema()
res = schema.dump(user)
print(isinstance(res,OrderedDict))  # 判断变量类型
# True
print(res)

顺序:fields = (“email”,“name”, “created_time”)
在这里插入图片描述


http://chatgpt.dhexx.cn/article/jcFNOlSg.shtml

相关文章

marshmallow——简介

一、marshmallow简介 在marshmallow诞生之前,已经有很多优秀的模块来用于数据的格式化和数据校验中。 因此书写mashmallow这个库的作者受这些库的启发,例如Django REST Framework, Flask-RESTful, 和colander这些。他同样从这些库中大量借用了设计和实现序列化、反序列化以及…

flask---》Marshmallow介绍及基础使用

0. Marshmallow背景介绍 介绍 Marshmallow&#xff0c;中文译作&#xff1a;棉花糖。是一个轻量级的数据格式转换的模块&#xff0c;也叫序列化和反序列化模块&#xff0c;常用于将复杂的orm模型对象与python原生数据类型之间相互转换。一般用于flaskmarshmallow提供了丰富的…

YApi接口平台-接口挡板

YApi是一个开源的平台&#xff0c;官方平台链接&#xff0c;如下https://hellosean1025.github.io/yapi/index.html,目前很多大公司在使用&#xff0c;主要优势我认为有2个&#xff0c;第一该平台开源&#xff0c;搭建方便&#xff1b;第二该平台解决了前后端分离开发的痛点&am…

open source HTML 5移动应用 -Exlive 人员定位客户端(BlackBerry 10, Android, iPhone)

下图是exlive人员定位系统的宣传页&#xff0c;其官方主站在这里 www.exlive.cn 下图是BlackBerry OS 7.0上面的运行效果&#xff0c;更多截图见这里 http://blog.csdn.net/berryreload/article/details/8099674 Update: Remove BlackBerry OS 7.0支持 升级到PhoneGap 3.0&…

My BlackBerry

什么是黑莓 RIM公司成立于1984年。 黑莓手机&#xff08;Blackberry&#xff09;&#xff0c;是指由加拿大Reserach In Motion&#xff08;RIM&#xff09;公司推出的一种无线手持邮件解决终端设备&#xff0c;也就是我们平时称的手机。 2013年1月30日&#xff0c;RIM公司今…

解决联网下载服务端返回405问题

最近遇到了一个问题&#xff0c;在项目中有一个启动页广告图片下载的功能&#xff0c;之前能够正常下载&#xff0c;由于这个版本遇到了运营商DNS劫持的问题&#xff0c;服务端要调整图片的下载路径&#xff0c;也就是改变了图片的链接地址。修改地址之后下载就出现异常了&…

IIS 405 Method Not Allowed

今天将项目发布到IIS上后&#xff0c;发现Delete方法用不了&#xff0c;可进行如下设置&#xff1a; 打开处理程序映射 找到WebDAV点击请求限制&#xff0c;勾选全部谓词 这个方法如果无效的话 方法二&#xff1a;因为是WebDAVModule限制的请求&#xff0c;所以直接将WebDAV…

前端请求接口时报405错误

他说方法不存在 他的问题所在就是没有找到后端对应的接口 意思就是说没有找到我后端put这个对应的接口 我记得写了不知道为啥没了纳闷

IIS put请求 报HTTP Error 405 - Method Not Allowed

在新的服务器上部署了一个.net core的项目&#xff0c;部分请求地址使用了put、delete方式&#xff0c;导致无法正常请求&#xff0c;报Error 405 - Method Not Allowed。 由于配置IIS时把“WebDAV 发布”给勾选了&#xff0c;所以会导致拦截。 服务器和IIS 10配置如下图&…

405 Method Not Allowed 解决方案

背景描述 前端发送请求到后端&#xff0c;可是经过swagger测试&#xff0c;后端接口是没问题的 可是一旦调用就发生405报错 解决方案 一般这种情况发生是因为前后端请求方式不一致 写在前端的接口声明方式是post 我们来看后端 很明显了&#xff0c;后端是get&#xff0c;因…

405 Method Not Allowed(亲测,实用)

今天在发布一个网站的时候遇到 标题上的问题&#xff0c;一直不明白是为何&#xff0c;刚开始以为是我的程序写的有问题&#xff0c;随即将项目发给同事来发布试试&#xff0c;在他的IIS上发布却没出现问题&#xff0c;一切正常&#xff0c;这可就怪了&#xff0c;于是想到了应…

宝塔面板数据库出现405 Not Allowed 错误的原因和解决办法

我们在网站建设和网站维护过程中&#xff0c;除了云服务器需要小心维护之外&#xff0c;还要应对突然出现的一些问题&#xff0c;比如今天网站突然打不开了&#xff0c;根据页面提示&#xff0c;貌似是数据库的原因&#xff0c;于是登录宝塔面板&#xff0c;想要看看数据库怎么…

浏览器页面报错405!

首先看浏览器的报错页面 后端控制台正常 可以明显的看出是因为我们提交的method是不被允许的&#xff0c;这就说明是我们的 请求方式的问题&#xff0c;常见的请求方式有 post,get.大家如果不知道自己默认的请求方式是get或者post,我们可以在继承HttpServlet的时候继承doGet(),…

html405是什么错误,网站打开显示405错误信息如何解决?

当我们打开网页时候&#xff0c;会显示404,405,500等报错信息&#xff0c;下面海站格给大家介绍常见的405报错时的处理方法&#xff1a; IIS 返回 405 - 不允许用于访问此页的 HTTP 谓词。终极解决办法!!!! 1、为什么会出现这个错误? 我们可以理解为在当前IIS服务器上&#xf…

一款ModbusRTU/TCP485串口协议调试软件工具绿色版免安装

软件的界面如下&#xff1a; 支持modbus设备的读写操作&#xff0c;把设备地址、功能码、寄存器地址、寄存器个数都显示出来了&#xff0c;浅析易懂&#xff0c;很适合初学者和工程师对modbus设备进行调试、测试。 一款好用的modbus调试大师助手软件工具操作演示&#xff0c;…

“405”报错解决方案

405是什么意思&#xff1f; 意思如下&#xff1a; “405”经常作为“Method Not Allowed”的缩写来使用&#xff0c;中文中表示&#xff1a;“不允许的方法”。 英文缩写词&#xff1a;405 英文单词&#xff1a;Method Not Allowed 缩写词分类&#xff1a;Internet 缩写词…

2.Modbus通信协议-软件调试4个工具软件(推荐)

Modbus通信协议-软件调试的4个工具软件 1.Launch Virtual Serial Port Driver 2.Modbus Poll 3.Modbus Slave 4.UartAssist 软件下载 以下为官网下载链接&#xff1a; Virtual Serial Port Driver Modbus Slave和Modbus Poll UartAssist 1.Virtual Serial Port Driver …

矩阵的迹规则

A为一个方阵&#xff0c;则Tr A表示A的迹&#xff08;就是主对角线上各项的和&#xff09;&#xff0c; 在量子力学中,Tr为迹,(trace),A,B,C为矩阵,证明:(1).Tr(AB)Tr(BA) ; (2).Tr(ABC)Tr(BCA)Tr(CAB) 第一个公式直接把(AB)ii的表达式写出来,然后求和,很容易证明与(BA)ii的…

矩阵的迹(Tr)

迹运算返回的是矩阵对角元素的和: 若不使用求和符号&#xff0c;有些矩阵运算很难描述&#xff0c;而通过矩 阵乘法和迹运算符号可以清楚地表示。例如&#xff0c;迹运算提供了另一种描述矩阵Frobenius范数的方式: 用迹运算表示表达式&#xff0c;我们可以使用很多有用的等式巧…