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$
|
$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')
|
||||||
|
|
|
@ -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']
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Add table
Reference in a new issue