class RESTResource(Resource): ''' Main resource responsible for routing REST requests to the implementing methods ''' isLeaf = True implements(IRESTResource) def __init__(self,services=(),schema=None,filters=()): ''' Constructor ''' self.services = services self.__router = RequestRouter(self,schema,filters) Resource.__init__(self) def render_GET(self,request): """ Handles all GET requests """ return self.__renderUrl(request) def render_POST(self,request): """ Handles all POST requests""" return self.__renderUrl(request) def render_PUT(self,request): """ Handles all PUT requests""" return self.__renderUrl(request) def render_DELETE(self,request): """ Handles all DELETE requests""" return self.__renderUrl(request) def __renderUrl(self,request): try: val = self.__router.getResponse(request) # return can be Deferred or Response if isinstance(val,Deferred): val.addCallback(self.__finishRequest,request) return NOT_DONE_YET elif isinstance(val,Response): self.__applyResponse(request, val.code, val.headers) return val.entity else: raise RuntimeError("Unexpected return type from request router %s" % val) except Exception as ex: self.__applyResponse(request, 500, None) return str(ex) def __finishRequest(self,response,request): if not request.finished: self.__applyResponse(request, response.code,response.headers) request.write(response.entity) request.finish() def __applyResponse(self,request,code,headers={"content-type":MediaType.TEXT_PLAIN}): request.setResponseCode(code) if headers != None: for header,value in headers.iteritems(): request.setHeader(header, value) def run(self,port=8080): """Shortcut for running app within Twisted reactor""" factory = Site(self) reactor.listenTCP(port, factory) #@UndefinedVariable reactor.run() #@UndefinedVariable
class RESTResource(Resource): ''' Main resource responsible for routing REST requests to the implementing methods ''' isLeaf = True implements(IRESTResource) def __init__(self,services=(),schema=None,filters=()): ''' Constructor ''' self.services = services self.__router = RequestRouter(self,schema,filters) Resource.__init__(self) def render_GET(self,request): """ Handles all GET requests """ return self.__renderUrl(request) def render_POST(self,request): """ Handles all POST requests""" return self.__renderUrl(request) def render_PUT(self,request): """ Handles all PUT requests""" return self.__renderUrl(request) def render_DELETE(self,request): """ Handles all DELETE requests""" return self.__renderUrl(request) def __renderUrl(self,request): try: val = self.__router.getResponse(request) # return can be Deferred or Response if isinstance(val,Deferred): val.addCallback(self.__finishRequest,request) return NOT_DONE_YET elif isinstance(val,Response): self.__applyResponse(request, val.code, val.headers) return val.entity else: raise RuntimeError("Unexpected return type from request router %s" % val) except Exception as ex: self.__applyResponse(request, 500, None) return str(ex) def __finishRequest(self,response,request): if not request.finished: self.__applyResponse(request, response.code,response.headers) request.write(bytes(response.entity)) request.finish() def __applyResponse(self,request,code,headers={"content-type":MediaType.TEXT_PLAIN}): if code is not None: request.setResponseCode(code) if headers != None: for header,value in headers.iteritems(): request.setHeader(header, value) def run(self,port=8080): """Shortcut for running app within Twisted reactor""" factory = Site(self) reactor.listenTCP(port, factory) #@UndefinedVariable reactor.run() #@UndefinedVariable