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:
parent
7b06a580fb
commit
c63285f8bc
3 changed files with 67 additions and 32 deletions
49
roa/json.py
49
roa/json.py
|
@ -22,6 +22,7 @@ Adapter(s)/view(s) for providing object attributes and other data in JSON format
|
|||
$Id$
|
||||
"""
|
||||
|
||||
from zope.interface import implements
|
||||
from cybertools.util import json
|
||||
|
||||
|
||||
|
@ -31,19 +32,45 @@ class JSONView(object):
|
|||
self.context = context
|
||||
self.request = request
|
||||
|
||||
def __call__(self):
|
||||
return self.context.__name__
|
||||
return json.dumps(self.context.__dict__.keys())
|
||||
# application methods, to be implemented by subclass
|
||||
|
||||
def create(self, name):
|
||||
print '*** create (PUT)', self.context, name
|
||||
return self.context
|
||||
def getData(self, **kw):
|
||||
return {}
|
||||
|
||||
def put(self):
|
||||
print '*** PUT', self.context
|
||||
return self.context
|
||||
def putData(self, data):
|
||||
return True
|
||||
|
||||
def createObject(self, name, data):
|
||||
return True
|
||||
|
||||
# protocol methods
|
||||
|
||||
def get(self):
|
||||
print '*** GET', self.context
|
||||
self.request.response.write('hello')
|
||||
return self.context
|
||||
self.setHeader()
|
||||
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')
|
||||
|
|
|
@ -30,33 +30,35 @@ jsonMimeTypes = ('application/json',)
|
|||
|
||||
|
||||
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):
|
||||
|
||||
def getChild(self, name):
|
||||
# may be overwritten by subclass
|
||||
return self.context.get(name)
|
||||
|
||||
def publishTraverse(self, request, name):
|
||||
if isJSONRequest(request):
|
||||
return self.jsonTraverse(request, name)
|
||||
return self.defaultTraverse(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)
|
||||
if item is None:
|
||||
view = component.getMultiAdapter((self.context, request), name='json')
|
||||
if view is None:
|
||||
return self.defaultTraverse(request, name)
|
||||
child = self.getChild(name)
|
||||
print '*** traversing', method, self.context, name, child
|
||||
if self.getTraversalStack():
|
||||
if child is None:
|
||||
raise AttributeError(name)
|
||||
return child
|
||||
if child is None:
|
||||
if method == 'PUT':
|
||||
view = component.getMultiAdapter((self.context, request), name='json')
|
||||
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)
|
||||
raise AttributeError(name)
|
||||
view = component.getMultiAdapter((child, request), name='json')
|
||||
if method == 'PUT':
|
||||
return view.put()
|
||||
return view.get()
|
||||
|
@ -68,3 +70,6 @@ class CheckJSONTraverser(ItemTraverser):
|
|||
if self.isJSONRequest(request):
|
||||
return self.context, ('@@json',)
|
||||
return super(CheckJSONTraverser, self).browserDefault(request)
|
||||
|
||||
def getTraversalStack(self):
|
||||
return self.request['TraversalRequestNameStack']
|
||||
|
|
|
@ -38,13 +38,16 @@ class CheckJSONTraverser(BaseTraverser, DefaultPublishTraverse):
|
|||
return DefaultPublishTraverse.browserDefault(self, request)
|
||||
|
||||
|
||||
old_traverse = HTTPRequest.traverse
|
||||
def install_traverse_patch():
|
||||
|
||||
base_traverse = HTTPRequest.traverse
|
||||
|
||||
def traverse(self, *args, **kw):
|
||||
if isJSONRequest(self):
|
||||
self.maybe_webdav_client = 0
|
||||
old_traverse(self, *args, **kw)
|
||||
return base_traverse(self, *args, **kw)
|
||||
|
||||
HTTPRequest.traverse = traverse
|
||||
|
||||
print '***** HTTPRequest.traverse monkey patch installed.'
|
||||
|
||||
install_traverse_patch()
|
||||
|
|
Loading…
Add table
Reference in a new issue