work in progress: REST/JSON handling

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@3543 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2009-09-08 07:16:49 +00:00
parent 7b06a580fb
commit c63285f8bc
3 changed files with 67 additions and 32 deletions

View file

@ -22,6 +22,7 @@ Adapter(s)/view(s) for providing object attributes and other data in JSON format
$Id$ $Id$
""" """
from zope.interface import implements
from cybertools.util import json from cybertools.util import json
@ -31,19 +32,45 @@ class JSONView(object):
self.context = context self.context = context
self.request = request self.request = request
def __call__(self): # application methods, to be implemented by subclass
return self.context.__name__
return json.dumps(self.context.__dict__.keys())
def create(self, name): def getData(self, **kw):
print '*** create (PUT)', self.context, name return {}
return self.context
def put(self): def putData(self, data):
print '*** PUT', self.context return True
return self.context
def createObject(self, name, data):
return True
# protocol methods
def get(self): def get(self):
print '*** GET', self.context print '*** GET', self.context
self.request.response.write('hello') self.setHeader()
return self.context return json.dumps(self.getData())
def put(self):
print '*** PUT', self.context, self.getBody()
self.setHeader()
result = self.putData(self.getBody())
return json.dumps(dict(ok=result))
def create(self, name):
print '*** create (PUT)', self.context, name, self.getBody()
self.setHeader(201)
result = self.createObject(name, self.getBody())
return json.dumps(dict(ok=result, id=name))
# helper methods
def getBody(self):
inp = self.request.stdin
inp.seek(0)
return inp.read()
def setHeader(self, status=None):
response = self.request.response
if status:
response.setStatus(status)
response.setHeader('Content-Type', 'application/json')

View file

@ -30,33 +30,35 @@ jsonMimeTypes = ('application/json',)
def isJSONRequest(request): def isJSONRequest(request):
return request.get('CONTENT_TYPE') in jsonMimeTypes return request.get('HTTP_ACCEPT').split(';', 1)[0] in jsonMimeTypes
#return request.get('CONTENT_TYPE') in jsonMimeTypes
class CheckJSONTraverser(ItemTraverser): class CheckJSONTraverser(ItemTraverser):
def getChild(self, name):
# may be overwritten by subclass
return self.context.get(name)
def publishTraverse(self, request, name): def publishTraverse(self, request, name):
if 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 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'] method = self.request['REQUEST_METHOD']
print '*** traversing', self.context, name, method child = self.getChild(name)
item = self.context.get(name) print '*** traversing', method, self.context, name, child
if item is None: if self.getTraversalStack():
view = component.getMultiAdapter((self.context, request), name='json') if child is None:
if view is None: raise AttributeError(name)
return self.defaultTraverse(request, name) return child
if child is None:
if method == 'PUT': if method == 'PUT':
view = component.getMultiAdapter((self.context, request), name='json')
return view.create(name) return view.create(name)
return self.defaultTraverse(request, name) raise AttributeError(name)
view = component.getMultiAdapter((item, request), name='json') view = component.getMultiAdapter((child, request), name='json')
if view is None:
return self.defaultTraverse(request, name)
if method == 'PUT': if method == 'PUT':
return view.put() return view.put()
return view.get() return view.get()
@ -68,3 +70,6 @@ class CheckJSONTraverser(ItemTraverser):
if self.isJSONRequest(request): if self.isJSONRequest(request):
return self.context, ('@@json',) return self.context, ('@@json',)
return super(CheckJSONTraverser, self).browserDefault(request) return super(CheckJSONTraverser, self).browserDefault(request)
def getTraversalStack(self):
return self.request['TraversalRequestNameStack']

View file

@ -38,13 +38,16 @@ class CheckJSONTraverser(BaseTraverser, DefaultPublishTraverse):
return DefaultPublishTraverse.browserDefault(self, request) return DefaultPublishTraverse.browserDefault(self, request)
old_traverse = HTTPRequest.traverse def install_traverse_patch():
def traverse(self, *args, **kw): base_traverse = HTTPRequest.traverse
if isJSONRequest(self):
self.maybe_webdav_client = 0
old_traverse(self, *args, **kw)
HTTPRequest.traverse = traverse def traverse(self, *args, **kw):
if isJSONRequest(self):
self.maybe_webdav_client = 0
return base_traverse(self, *args, **kw)
print '***** HTTPRequest.traverse monkey patch installed.' HTTPRequest.traverse = traverse
print '***** HTTPRequest.traverse monkey patch installed.'
install_traverse_patch()