work in progress: Resource-oriented Architecture with Zope 2: handle GET and PUT via methods of a view

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@3527 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2009-09-04 12:31:54 +00:00
parent b48f8ef9e3
commit 8fdd5971fc
3 changed files with 49 additions and 13 deletions

View file

@ -32,9 +32,18 @@ class JSONView(object):
self.request = request self.request = request
def __call__(self): def __call__(self):
return self.context.__name__
return json.dumps(self.context.__dict__.keys()) return json.dumps(self.context.__dict__.keys())
def traverse(self, name): def create(self, name):
# To be implemented by subclass print '*** create (PUT)', self.context, name
print '*** traversing', self.context, name return self.context
def put(self):
print '*** PUT', self.context
return self.context
def get(self):
print '*** GET', self.context
self.request.response.write('hello')
return self.context return self.context

View file

@ -29,25 +29,37 @@ from zope import component
jsonMimeTypes = ('application/json',) jsonMimeTypes = ('application/json',)
def isJSONRequest(request):
return request.get('CONTENT_TYPE') in jsonMimeTypes
class CheckJSONTraverser(ItemTraverser): class CheckJSONTraverser(ItemTraverser):
def publishTraverse(self, request, name): def publishTraverse(self, request, name):
if self.isJSONRequest(request): if isJSONRequest(request):
return self.jsonTraverse(request, name) return self.jsonTraverse(request, name)
return self.defaultTraverse(request, name) return self.defaultTraverse(request, name)
def isJSONRequest(self, request):
return request.get('CONTENT_TYPE') in jsonMimeTypes
def jsonTraverse(self, request, name): def jsonTraverse(self, request, name):
print '*** jsonTraverse', self.context, name
if request['TraversalRequestNameStack']:
return self.defaultTraverse(request, name)
method = self.request['REQUEST_METHOD']
print '*** traversing', self.context, name, method
item = self.context.get(name) item = self.context.get(name)
if item is not None: if item is None:
return item view = component.getMultiAdapter((self.context, request), name='json')
# TODO: specify provides=IJSONView if view is None:
view = component.getMultiAdapter((self.context, request), name='json') return self.defaultTraverse(request, name)
if method == 'PUT':
return view.create(name)
return self.defaultTraverse(request, name)
view = component.getMultiAdapter((item, request), name='json')
if view is None: if view is None:
return self.defaultTraverse(request, name) return self.defaultTraverse(request, name)
return view.traverse(name) if method == 'PUT':
return view.put()
return view.get()
def defaultTraverse(self, request, name): def defaultTraverse(self, request, name):
return super(CheckJSONTraverser, self).publishTraverse(request, name) return super(CheckJSONTraverser, self).publishTraverse(request, name)

View file

@ -22,7 +22,10 @@ $Id$
""" """
from ZPublisher.BaseRequest import DefaultPublishTraverse from ZPublisher.BaseRequest import DefaultPublishTraverse
from ZPublisher.HTTPRequest import HTTPRequest
from cybertools.roa.traversal import CheckJSONTraverser as BaseTraverser from cybertools.roa.traversal import CheckJSONTraverser as BaseTraverser
from cybertools.roa.traversal import isJSONRequest
class CheckJSONTraverser(BaseTraverser, DefaultPublishTraverse): class CheckJSONTraverser(BaseTraverser, DefaultPublishTraverse):
@ -30,6 +33,18 @@ class CheckJSONTraverser(BaseTraverser, DefaultPublishTraverse):
defaultTraverse = DefaultPublishTraverse.publishTraverse defaultTraverse = DefaultPublishTraverse.publishTraverse
def browserDefault(self, request): def browserDefault(self, request):
if self.isJSONRequest(request): if isJSONRequest(request):
return self.context, ('@@json',) return self.context, ('@@json',)
return DefaultPublishTraverse.browserDefault(self, request) return DefaultPublishTraverse.browserDefault(self, request)
old_traverse = HTTPRequest.traverse
def traverse(self, *args, **kw):
if isJSONRequest(self):
self.maybe_webdav_client = 0
old_traverse(self, *args, **kw)
HTTPRequest.traverse = traverse
print '***** HTTPRequest.traverse monkey patch installed.'