Если вам не нужно десериализовать как определенный класс или вам не нужна пользовательская логика сериализации, вы можете просто сделать это (адаптировано из https://kimsereylam.com/python/2019/10/25/serialization-with-marshmallow)..html):
from marshmallow import Schema, fields
from datetime import datetime
class UserSchema(Schema):
name = fields.Str(required=True)
email = fields.Email()
created_at = fields.DateTime()
schema = UserSchema()
data = { "name": "Some Guy", "email": "[email protected]": datetime.now() }
user = schema.load(data)
Вы также можете создать функцию в своем классе, которая создает dict с правилами проверки, хотя это все равно будет избыточно, это позволит вам сохранить все в вашем классе модели:
class User:
def __init__(name, email, created_at):
self.name = name
self.email = email
self.created_at = created_at
@classmethod
def Schema(cls):
return {"name": fields.Str(), "email": fields.Email(), "created_at": fields.DateTime()}
UserSchema = Schema.from_dict(User.Schema)
Если вам нужна строгая типизация и полная функциональность проверки, рассмотрите flask-pydantic или marshmallow-dataclass.
marshmallow-dataclass предлагает множество функций проверки, аналогичных marshmallow. Хотя это как-то связывает руки. Он не имеет встроенной поддержки настраиваемых полей/полиморфизма (вместо этого нужно использовать marshmallow-union) и, похоже, не очень хорошо работает со стековыми пакетами, такими как flask-marshmallow и marshmallow-sqlalchemy. https://pypi.org/project/marshmallow-dataclass/
from typing import ClassVar, Type
from marshmallow_dataclass import dataclasses
from marshmallow import Schema, field, validate
@dataclass
class Person:
name: str = field(metadata=dict(load_only=True))
height: float = field(metadata=dict(validate=validate.Range(min=0)))
Schema: ClassVar[Type[Schema]] = Schema
Person.Schema().dump(Person('Bob', 2.0))
# => {'height': 2.0}
flask-pydantic менее элегантен с точки зрения проверки, но предлагает многие из тех же функций, а проверка встроена в класс. Обратите внимание, что простые проверки, такие как min/max, более неудобны, чем в зефире. Лично я предпочитаю держать логику представления/API вне класса. https://pypi.org/project/Flask-Pydantic/
from typing import Optional
from flask import Flask, request
from pydantic import BaseModel
from flask_pydantic import validate
app = Flask("flask_pydantic_app")
class QueryModel(BaseModel):
age: int
class ResponseModel(BaseModel):
id: int
age: int
name: str
nickname: Optional[str]
# Example 1: query parameters only
@app.route("/", methods=["GET"])
@validate()
def get(query:QueryModel):
age = query.age
return ResponseModel(
age=age,
id=0, name="abc", nickname="123"
)
person
VoteCoffee
schedule
22.03.2021