Need help with hyp?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

kalasjocke
124 Stars 13 Forks MIT License 101 Commits 3 Opened issues

Description

Partial JSON API implementation in Python

Services available

!
?

Need anything else?

Contributors list

# 159,621
React N...
Shell
serde
python-...
77 commits
# 2,050
Flask
python-...
python-...
repl
13 commits
# 132,684
Go
Git
golang
package...
2 commits
# 515,309
HTML
CSS
oauth2
Shell
1 commit

Hyp Build Status

JSON-API responses in Python.

About

Hyp is a library implementing the must parts of the JSON-API response specification. This means that you can use Hyp to serialize your models into responses that contain links and linked compound documents. It works really good in combination with your micro web framework of choice, preferably Flask.

It has built in support for both Schematics and Marshmallow in the sense that you can use any of them for serializing your models (or primitives) into JSON that Hyp creates responses from. To add support for more data serialization libraries such as Colander should be trivial.

Depending on which serialization library that you would like to use make sure to add it to your app's requirements.

Tutorial

First let's define some serializers for your models:

from marshmallow import Schema, fields


class CommentSchema(Schema): id = fields.Integer() content = fields.String()

class PersonSchema(Schema): id = fields.Integer() name = fields.String()

class PostSchema(Schema): id = fields.Integer() title = fields.String()

We can then create our own responders using the

hyp.Responders
class:
from hyp.marshmallow import Responder


class CommentResponder(Responder): TYPE = 'comments' SERIALIZER = CommentSchema

class PersonResponder(Responder): TYPE = 'people' SERIALIZER = PersonSchema

class PostResponder(Responder): TYPE = 'posts' SERIALIZER = PostSchema LINKS = { 'comments': { 'responder': CommentResponder, 'href': 'http://example.com/comments/{posts.comments}', }, 'author': { 'responder': PersonResponder, 'href': 'http://example.com/people/{posts.author}', }, }

Finally we can use our responders for creating responses. These responses goes perfectly into any Flask application out there:

post = {
    'id': 1,
    'title': 'My post',
    'comments': [
        {'id': 1, 'content': 'A comment'},
        {'id': 2, 'content': 'Another comment'},
    ]
}

json = PostResponder.respond(post, linked={'comments': post['comments']})

The

json
variable will now contain some freshly squeezed JSON ready for sending back to the client:
{
    "posts": [
        {
            "id": 1,
            "title": "My title",
            "links": {
                "comments": [1, 2]
            }
        }
    ],
    "linked": {
        "comments": [
            {
                "id": 1,
                "content": "My comment"
            },
            {
                "id": 2,
                "content": "Another comment"
            }
        ]
    },
    "links": {
        "posts.comments": {
            "type": "comments",
            "href": "http://example.com/comments/{posts.comments}"
        }
    }
}

If you'd like to get have dict returned instead of json, for example if you want to use flask's jsonify, then you can use the

build
method instead:
post = {
    'id': 1,
    'title': 'My post',
    'comments': [
        {'id': 1, 'content': 'A comment'},
        {'id': 2, 'content': 'Another comment'},
    ]
}

response = PostResponder.build(post, linked={'comments': post['comments']}) json = flask.jsonify(response)

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.