Marshmallow schema basics
In this post we're going to cover the basics of working with Marshmallow.
Marshmallow is a Python library which enables us to easily sanitize and validate content according to a schema.
Schemas are useful when we want to sift through user provided data en-masse as opposed to dealing with each item individually.
from marshmallow import Schema, fields class _Schema(Schema): class Meta: dateformat = "%Y-%m-%d"
Here we extend the default
Schema class with our own which will output a custom date format.
Meta subclass supports plenty of methods to customize our schema,
such as excluding some of the fields or explictly including them.
More can be read in the manual:
class Slug(fields.Field): def _serialize(self, value, attr, obj): if value: return str(value).lower().replace(' ', '-')
Above we define a custom field which will serialize its value using the provided function. And we use this field below in our crude blog schema.
class CommentSchema(_Schema): author = fields.Str() body = fields.Str() class PostSchema(_Schema): slug = Slug(required=True) date = fields.DateTime(required=True) title = fields.Str(required=True) body = fields.Str(required=True) tags = fields.List(fields.Str()) comments = fields.List(fields.Nested(CommentSchema()))
The last two are compound fields, with
comments being more interesting
as it is a list of comment schemas. When referring to another schema instead of a field type
we need to use the
And in a nutshell there we have it. Now all that's left is to use it to sanitize our blog post through the schema:
schema = PostSchema() post = schema.dump(raw_post).data
Validation was left out from here and we will cover it in another blog post.