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:
parent
b48f8ef9e3
commit
8fdd5971fc
3 changed files with 49 additions and 13 deletions
15
roa/json.py
15
roa/json.py
|
@ -32,9 +32,18 @@ class JSONView(object):
|
|||
self.request = request
|
||||
|
||||
def __call__(self):
|
||||
return self.context.__name__
|
||||
return json.dumps(self.context.__dict__.keys())
|
||||
|
||||
def traverse(self, name):
|
||||
# To be implemented by subclass
|
||||
print '*** traversing', self.context, name
|
||||
def create(self, name):
|
||||
print '*** create (PUT)', 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
|
||||
|
|
|
@ -29,25 +29,37 @@ from zope import component
|
|||
jsonMimeTypes = ('application/json',)
|
||||
|
||||
|
||||
def isJSONRequest(request):
|
||||
return request.get('CONTENT_TYPE') in jsonMimeTypes
|
||||
|
||||
|
||||
class CheckJSONTraverser(ItemTraverser):
|
||||
|
||||
def publishTraverse(self, request, name):
|
||||
if self.isJSONRequest(request):
|
||||
if isJSONRequest(request):
|
||||
return self.jsonTraverse(request, name)
|
||||
return self.defaultTraverse(request, name)
|
||||
|
||||
def isJSONRequest(self, request):
|
||||
return request.get('CONTENT_TYPE') in jsonMimeTypes
|
||||
|
||||
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)
|
||||
if item is not None:
|
||||
return item
|
||||
# TODO: specify provides=IJSONView
|
||||
view = component.getMultiAdapter((self.context, request), name='json')
|
||||
if item is None:
|
||||
view = component.getMultiAdapter((self.context, request), name='json')
|
||||
if view is None:
|
||||
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:
|
||||
return self.defaultTraverse(request, name)
|
||||
return view.traverse(name)
|
||||
if method == 'PUT':
|
||||
return view.put()
|
||||
return view.get()
|
||||
|
||||
def defaultTraverse(self, request, name):
|
||||
return super(CheckJSONTraverser, self).publishTraverse(request, name)
|
||||
|
|
|
@ -22,7 +22,10 @@ $Id$
|
|||
"""
|
||||
|
||||
from ZPublisher.BaseRequest import DefaultPublishTraverse
|
||||
from ZPublisher.HTTPRequest import HTTPRequest
|
||||
|
||||
from cybertools.roa.traversal import CheckJSONTraverser as BaseTraverser
|
||||
from cybertools.roa.traversal import isJSONRequest
|
||||
|
||||
|
||||
class CheckJSONTraverser(BaseTraverser, DefaultPublishTraverse):
|
||||
|
@ -30,6 +33,18 @@ class CheckJSONTraverser(BaseTraverser, DefaultPublishTraverse):
|
|||
defaultTraverse = DefaultPublishTraverse.publishTraverse
|
||||
|
||||
def browserDefault(self, request):
|
||||
if self.isJSONRequest(request):
|
||||
if isJSONRequest(request):
|
||||
return self.context, ('@@json',)
|
||||
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.'
|
||||
|
|
Loading…
Add table
Reference in a new issue