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
|
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
|
||||||
|
|
|
@ -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
|
|
||||||
# TODO: specify provides=IJSONView
|
|
||||||
view = component.getMultiAdapter((self.context, request), name='json')
|
view = component.getMultiAdapter((self.context, 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.create(name)
|
||||||
|
return self.defaultTraverse(request, name)
|
||||||
|
view = component.getMultiAdapter((item, request), name='json')
|
||||||
|
if view is None:
|
||||||
|
return self.defaultTraverse(request, 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)
|
||||||
|
|
|
@ -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.'
|
||||||
|
|
Loading…
Add table
Reference in a new issue