14. Traversal
child = parent['child']
assert child.__name__ == 'child'
assert child.__parent__ is parent
GET /users/1/ -> 404 Not Found
root['users']['1'] -> KeyError
15. Traversal
class Root(object):
""" API root resource """
def __getitem__(self, name):
if name == 'users':
return Users(name, self)
raise KeyError(name)
class Users(object):
""" Collection of users """
def __init__(self, name, parent):
self.__name__ = name
self.__parent__ = parent
16. TraversalKit
from traversalkit import Resource, DEC_ID
class Root(Resource): # /
""" API root resource """
@Root.mount('users') # /users/
class Users(Resource):
""" Collection of users """
@Users.mount_set(DEC_ID) # /users/{^[0-9]+$}/
class User(Resource):
""" Particular user """
19. Загрузка элемента
from ..store import db
@Articles.mount_set(DEC_ID)
class Article(Resource):
__not_exist__ = db.NoResultFound
def on_init(self, data=None):
if data is None:
# Created via __getitem__
session = db.Session()
data = session
.query(db.Article)
.filter(db.Article.id == int(self.__name__))
.one()
self.data = data
20. Загрузка списка
from ..store import db
class Articles(Resource):
def get_list(self, offset=0, limit=50):
session = db.Session()
query = session
.query(db.Article)
.limit(limit)
.offset(offset)
.order_by(db.Article.created_at)
return [
self.get(str(item.id), item)
for item in query.all()
]
21. Иерархия
@Root.mount('articles') # All articles
class Articles(Resource):
""" Collection of articles """
@Article.mount('comments') # Article's comments
class Comments(Resource):
""" Collection of comments """
22. Иерархия
@Root.mount('articles') # All articles
@User.mount('articles') # User's articles
class Articles(Resource):
""" Collection of articles """
@Article.mount('comments') # Article's comments
@User.mount('comments') # User's comments
class Comments(Resource):
""" Collection of comments """