This example shows how to integrate marshmallow with sanic-boom, in a way where you can have a generic type that, followed by a defined schema inside some route, will parse the response.json object given to that schema and return the created object to the handler.

Think of this as a “barebone simpler version” of DRF or any other serializer / deserializer.

"""Example code taken from

import datetime as dt
import inspect
import typing as t

from marshmallow import Schema, fields, post_load
from sanic.exceptions import ServerError
from sanic.response import text

from sanic_boom import Component, SanicBoom

# --------------------------------------------------------------------------- #
# marshmallow related code
# --------------------------------------------------------------------------- #

class User(object):
    def __init__(self, name, email): = name = email
        self.created_at =

    def __repr__(self):
        return "<User(name={!r})>".format(self=self)

    def say_hi(self):
        return "hi, my name is {}".format(

class UserSchema(Schema):
    name = fields.Str()
    email = fields.Email()
    created_at = fields.DateTime()

    def make_user(self, data):
        return User(**data)

# --------------------------------------------------------------------------- #
# sanic-boom related code
# --------------------------------------------------------------------------- #

class JSONBody(t.Generic[t.T_co]):

class JSONBodyComponent(Component):
    def resolve(self, param: inspect.Parameter) -> bool:
        if hasattr(param.annotation, "__origin__"):
            return param.annotation.__origin__ == JSONBody
        return False

    async def get(self, request, param: inspect.Parameter) -> object:
        inferred_type = param.annotation.__args__[0]
            return inferred_type().load(request.json).data
        except Exception:
            raise ServerError(
                "Couldn't convert JSON body to {!s}".format(inferred_type)

app = SanicBoom(__name__)
async def handler(user: JSONBody[UserSchema]):  # notice the handler parameters
    return text(user.say_hi())

if __name__ == "__main__":"", port=8000, workers=1)

# then, run:
# curl -v http://localhost:8000/ -d '{"name":"John Doe","email":"john.doe@example.tld"}'


This example is just illustrative. You can use any other ODM-like library in here. Take a look on middle, another package by the same author of sanic-boom.