Skip to content

A FastAPI + Pydantic extension for simplifying hypermedia-driven API development.

License

Notifications You must be signed in to change notification settings

jtc42/fastapi-hypermodel

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FastAPI-HyperModel

Simple hypermedia for FastAPI

Package version


Documentation: https://jtc42.github.io/fastapi-hypermodel/

Source Code: https://github.com/jtc42/fastapi-hypermodel


FastAPI-HyperModel is a FastAPI + Pydantic extension for simplifying hypermedia-driven API development.

Hypermedia consist of enriching API responses by providing links to other URIs within the services to fetch related resources or perform certain actions. There are several levels according to the Hypermedia Maturity Model Levels. Using Hypermedia makes APIs reach Level 3 of the Richardson Maturity Model (RMM), which involves leveraging Hypertext As The Engine Of Application State (HATEOAS), that is, Hypermedia.

Below are some examples of responses using hypermedia. For detailed examples, check the docs.

Format Response

No Hypermedia

{
    "id_": "item01",
    "name": "Foo",
    "price": 10.2,
}

Level 0 Hypermedia (URLFor)

{
    "id_": "item01",
    "name": "Foo",
    "price": 10.2,

    "href": "/items/item01",
    "update": "/items/item01"
}

Level 1 Hypermedia (HAL)

{
    "id_": "item01",
    "name": "Foo",
    "price": 10.2,

    "_links": {
        "self": {"href": "/items/item01"},
        "update": {"href": "/items/item01"},
    },
}

Level 2 Hypermedia (Siren)

{
    "properties": {
        "id_": "item01",
        "name": "Foo",
        "price": 10.2
    },
    "links": [
        {
            "rel": ["self"],
            "href": "/items/item01"
        }
    ],
    "actions": [
        {
            "name": "update",
            "method": "PUT",
            "href": "/items/item01",
            "type": "application/x-www-form-urlencoded",
            "fields": [
                {
                    "name": "name",
                    "type": "text",
                    "value": "Foo"
                },
                {
                    "name": "description",
                    "type": "text",
                    "value": "None"
                },
                {
                    "name": "price",
                    "type": "number",
                    "value": "10.2"
                }
            ]
        }
    ]
}

Installation

pip install fastapi-hypermodel

Limitations

Currently, query parameters will not resolve correctly. When generating a resource URL, ensure all parameters passed are path parameters, not query parameters.

This is an upstream issue, being tracked here.

Attributions

Huge thanks to @christoe for building support for Pydantic 2.

About

A FastAPI + Pydantic extension for simplifying hypermedia-driven API development.

Resources

License

Stars

Watchers

Forks

Languages