def dispatch(self, request, *args, **kwargs): try: method = request.method.lower() if method in self.http_method_names and hasattr(self, method): handler = getattr( self, 'dispatch_%s' % method, self.http_method_not_allowed) else: handler = self.http_method_not_allowed self.is_authenticated(request) self.is_authorized(request) self.throttle_check(request) self.request = request self.args = args self.kwargs = kwargs try: response = handler(request, *args, **kwargs) except ValidationError, e: # Catch ValidationError here for non-resources can throw them. self.raise_validation_error(request, e.form_errors) except ImmediateHttpResponse, e: if e.response is not None: response = e.response else: desired_format = self.determine_format(request) response_kwargs = e.response_kwargs response_kwargs['content_type'] = response_kwargs.get( 'content_type', build_content_type(desired_format)) response = e.response_cls(**response_kwargs)
def dispatch(self, request, *args, **kwargs): try: method = request.method.lower() if method in self.http_method_names and hasattr(self, method): handler = getattr( self, 'dispatch_%s' % method, self.http_method_not_allowed) else: handler = self.http_method_not_allowed self.is_authenticated(request) self.is_authorized(request) self.throttle_check(request) self.request = request self.args = args self.kwargs = kwargs try: response = self.dispatch_any(request, handler, *args, **kwargs) except ValidationError, e: # Catch ValidationError here for non-resources can throw them. self.raise_validation_error(request, e.form_errors) except ImmediateHttpResponse, e: if e.response is not None: response = e.response else: desired_format = self.determine_format(request) response_kwargs = e.response_kwargs response_kwargs['content_type'] = response_kwargs.get( 'content_type', build_content_type(desired_format)) response = e.response_cls(**response_kwargs)
def raise_http_error(self, request, error, response_cls=cake_http.HttpBadRequest): if request: desired_format = self.determine_format(request) else: desired_format = self._meta.default_format response = response_cls( content_type=build_content_type(desired_format), content=self.serialize(request, error, desired_format)) raise ImmediateHttpResponse(response=response)
def create_http_response(self, request, resource_response, created=False, force_include_entity=None, default_response_cls=None, **default_response_kwargs): if resource_response is None: return include_entity = self._get_include_entity( resource_response, force_include_entity) entity_cls = resource_response.get_entity_cls( self._meta.get_detail_entity_cls()) if resource_response.obj is None: if created or include_entity: raise ResourceEntityError( "'ResourceResponse.obj' must not be None if 'created'" \ " or 'include_entity' is True") entity = None else: if entity_cls is None: raise ResourceEntityError( "Must specify 'entity_cls' or 'detail_entity_cls' if" \ " 'created' or 'include_entity' is True") entity = entity_cls(resource_response.obj) if created: http_response_cls = cake_http.HttpCreated http_response_kwargs = {'location': entity.get_resource_uri()} else: http_response_cls, http_response_kwargs = \ self.get_http_response_details( resource_response, entity, include_entity, default_response_cls, default_response_kwargs) desired_format = self.determine_format(request) content = '' if entity is None or include_entity is False else \ self.serialize(request, entity.full_process(), desired_format) http_response = http_response_cls( content=content, content_type=build_content_type(desired_format), **http_response_kwargs) self._process_http_response(request, http_response, entity) return http_response
def handle_exception(self, request, exception): desired_format = self.determine_format(request) content_type = build_content_type(desired_format) if isinstance(exception, NOT_FOUND_EXCEPTIONS): response = cake_http.HttpNotFound(content_type=content_type) elif isinstance(exception, UnsupportedSerializationFormat): response = cake_http.HttpNotAcceptable(content_type=content_type) elif isinstance(exception, UnsupportedDeserializationFormat): response = cake_http.HttpUnsupportedMediaType( content_type=content_type) elif isinstance(exception, MultipleObjectsReturned): response = cake_http.HttpMultipleChoices(content_type=content_type) elif isinstance(exception, BadRequest): response = cake_http.HttpBadRequest(exception.message) else: if settings.DEBUG: data = { 'error_message': unicode(exception), 'traceback': '\n'.join( traceback.format_exception(*(sys.exc_info())))} else: data = { 'error_message': getattr( settings, 'DELICIOUS_CAKE_CANNED_ERROR', 'Sorry, this request could not be processed. ' \ 'Please try again later.')} response = cake_http.HttpApplicationError( content=self.serialize(request, data, desired_format), content_type=content_type, status=500) if settings.DEBUG or response.status_code == 500: log.error('Server Error: %s' % request.path, exc_info=sys.exc_info(), extra={'request': request}) # SEND ERROR NOTIFICATIONS HERE! return response
def create_http_list_response(self, request, resource_response, paginated=False, force_include_entity=None, default_response_cls=None, **default_response_kwargs): if resource_response is None: return include_entity = self._get_include_entity( resource_response, force_include_entity) entity_cls = resource_response.get_entity_cls( self._meta.get_detail_entity_cls()) if entity_cls is None and include_entity: raise ResourceEntityError( "Must specify 'entity_cls', 'list_entity_cls', or " \ "'detail_entity_cls' if 'include_entity' is True") obj = resource_response.obj if obj is None: entities = [] elif not isinstance(obj, collections.Iterable): entities = [obj] else: entities = obj if paginated: paginator = self._meta.paginator_cls( request.GET, entities, resource_uri=self.get_resource_uri(), limit=self._meta.limit, max_limit=self._meta.max_limit, collection_name=self._meta.collection_name) page = paginator.page() entities = page[self._meta.collection_name] else: page = {} page[self._meta.collection_name] = entities http_response_cls, http_response_kwargs = \ self.get_http_response_details( resource_response, entities, include_entity, default_response_cls, default_response_kwargs) desired_format = self.determine_format(request) if include_entity: entities = [entity_cls(obj).full_process() for obj in entities] page[self._meta.collection_name] = entities content = self.serialize(request, page, desired_format) else: content = '' entities = None http_response = http_response_cls( content=content, content_type=build_content_type(desired_format), **http_response_kwargs) self._process_http_response(request, http_response, entities) return http_response