四、 Marshmallow Schemas 介绍 (Flask开发应用)

Marshmallow Schemas 介绍 (Flask开发应用)

  • Schemas
  • Fields
  • 基本使用
  • 进阶使用

Marshmallow 是一个用于序列化和反序列化复杂数据类型(例如对象)到 Python 原生数据类型(如字典、列表)的库,同时它也提供数据验证功能。在许多 Flask 项目中,Marshmallow 常用于处理 JSON 请求和响应数据的验证和格式化。
marshmallow是一个用来将复杂的orm对象与python原生数据类型之间相互转换的库,简而言之,就是实现:
object -> dict,object -> json string,object -> list
json string -> dict,json string -> list,json string -> object
dict -> object,list -> object。
marshmallow在反序列化(dict/str/list->object)的时候,可以进行数据字段的校验。因此数据校验仅仅是marshmallow的附加功能。

Schemas

在 Marshmallow 中,Schema 用于定义数据的结构和验证规则。每个 Schema 包含一系列的字段(Field),这些字段定义了数据应该如何被序列化(转换成 JSON)和反序列化(从 JSON 转换回 Python 数据类型)。

Fields

字段是 Schema 的基本组成部分,代表数据的一个属性。Marshmallow 提供了许多内置的字段类型,例如 StringIntegerDateTime 等,每种字段类型都有自己的验证器和处理逻辑。

基本使用

  1. 定义 Schema:首先,你需要定义一个 Schema 类,指定想要序列化/反序列化的数据结构。
from marshmallow import Schema, fields

class UserSchema(Schema):
    username = fields.Str(required=True)
    email = fields.Email(required=True)
    age = fields.Integer(required=True, validate=lambda val: val > 0)

在这个例子中,我们定义了一个 UserSchema,它有三个字段:usernameemailagerequired=True 表示这些字段是必须的,validate 参数用于指定一个验证函数。

  1. 序列化:使用 dump()dumps() 方法将 Python 对象转换成字典或 JSON 字符串。
user_data = {
    'username': 'johndoe',
    'email': '[email protected]',
    'age': 25
}

schema = UserSchema()
result = schema.dump(user_data)
print(result)  # 输出序列化后的字典
  1. 反序列化:使用 load()loads() 方法将输入的数据(一般是 JSON 格式)转换成 Python 对象。
input_data = {
    'username': 'janedoe',
    'email': '[email protected]',
    'age': 22
}

schema = UserSchema()
result = schema.load(input_data)
print(result)  # 输出反序列化后的字典

如果输入数据不符合定义的 Schema,load() 方法将抛出 ValidationError

  1. 验证Schema 还可以用来验证数据。如果数据无效,可以捕获 ValidationError 并处理错误。
try:
    result = schema.load({'username': 'johndoe', 'email': 'not-an-email', 'age': 25})
except ValidationError as err:
    print(err.messages)  # 输出错误信息

进阶使用

Marshmallow 还允许自定义验证函数、使用函数或方法进行字段的后处理、处理复杂的嵌套结构、支持字段的默认值和缺失值处理等。

通过使用 Marshmallow,你可以构建强大而灵活的数据处理逻辑,同时确保 API 与外部系统交互时的数据的有效性和一致性。

一篇写的比较好的教程

你可能感兴趣的:(flask,数据库,python)