Created
May 27, 2014 09:59
-
-
Save simonedeponti/d23e0597dbc83a6cf080 to your computer and use it in GitHub Desktop.
Rest API example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import json | |
from zope.interface import Interface | |
from zope.interface import implementer | |
from zope.interface import alsoProvides | |
from zope.component import adapter | |
from zope.traversing.interfaces import ITraversable | |
from zope.publisher.interfaces.http import IHTTPRequest | |
from ZPublisher.BaseRequest import DefaultPublishTraverse | |
from Products.Five.browser import BrowserView | |
from Products.CMFPlone.interfaces.siteroot import IPloneSiteRoot | |
# XXX: This interface is needed else we end up | |
# on the traverser of plone.app.imaging | |
# used for archetypes that implements .../image_<size_name> | |
from plone.app.imaging.interfaces import IBaseObject | |
class IAPIRequest(Interface): | |
"""Marker for API requests | |
""" | |
class IPutRequest(Interface): | |
"""Marker for API requests, PUT verb | |
""" | |
class IDeleteRequest(Interface): | |
"""Marker for API requests, DELETE verb | |
""" | |
@adapter(IBaseObject, IAPIRequest) | |
class APIInnerTraverser(DefaultPublishTraverse): | |
"""Traverser for API requests (needed just to support verbs) | |
""" | |
def publishTraverse(self, request, name): | |
# TODO: WebDav here usually mangles a bit some variables in request | |
# (like traversed stuff, etc) so the fake PUT or DELETE at the end | |
# is removed | |
if name == 'PUT': | |
alsoProvides(request, IPutRequest) | |
elif name == 'DELETE': | |
alsoProvides(request, IDeleteRequest) | |
# more verbs here | |
return super(APIInnerTraverser, self).publishTraverse(request, name) | |
@adapter(IPloneSiteRoot, IHTTPRequest) | |
@implementer(ITraversable) | |
class APITraverser(object): | |
"""The root API traverser | |
""" | |
def __init__(self, context, request=None): | |
self.context = context | |
self.request = request | |
def traverse(self, name, postpath): # pylint: disable=unused-argument | |
alsoProvides(self.request, IAPIRequest) | |
return self.context |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment