Skip to content

Instantly share code, notes, and snippets.

@simonedeponti
Created May 27, 2014 09:59
Show Gist options
  • Save simonedeponti/d23e0597dbc83a6cf080 to your computer and use it in GitHub Desktop.
Save simonedeponti/d23e0597dbc83a6cf080 to your computer and use it in GitHub Desktop.
Rest API example
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