def custom_exception_handler(exc, context): """ Returns the response that should be used for any given exception. By default we handle the REST framework `APIException`, and also Django's built-in `Http404` and `PermissionDenied` exceptions. Any unhandled exceptions may return `None`, which will cause a 500 error to be raised. """ if isinstance(exc, Http404): exc = exceptions.NotFound() elif isinstance(exc, PermissionDenied): exc = exceptions.PermissionDenied() if isinstance(exc, exceptions.APIException): headers = {} if getattr(exc, 'auth_header', None): headers['WWW-Authenticate'] = exc.auth_header if getattr(exc, 'wait', None): headers['Retry-After'] = '%d' % exc.wait if isinstance(exc.detail, (list, dict)): data = exc.detail else: data = {'detail': exc.detail} set_rollback() if exc.status_code == 400: code, message = response_code.ERR_PARAM_ERROR elif exc.status_code == 401: code, message = response_code.ERR_AUTH_ERROR elif exc.status_code == 403: code, message = response_code.ERR_PERMISSION_ERROR elif exc.status_code == 404: code, message = response_code.ERR_NOT_FOUND_ERROR elif exc.status_code == 500: code, message = response_code.ERR_SERVER_ERROR elif exc.status_code == 405: code, message = response_code.ERR_METHOD_NOT_ALLOWED else: code, message = response_code.ERR_UNKNOWN_ERROR return simple_response(code=code, data=data, message=message, headers=headers) elif isinstance(exc, CustomAPIException): # 捕获自定义的异常 set_rollback() return simple_response(code=exc.get_code(), message=exc.get_message(), data=exc.get_data()) return None
def retrieve(self, request, *args, **kwargs): instance = self.get_object() serializer = self.get_serializer(instance) # return Response(serializer.data) return simple_response(data=serializer.data, code=response_code.SUCCESS[0], message="ok.")
def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) self.perform_create(serializer) headers = self.get_success_headers(serializer.data) # return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) return simple_response(data=serializer.data, code=response_code.SUCCESS[0], headers=headers, message="Created.")
def list(self, request, *args, **kwargs): queryset = self.filter_queryset(self.get_queryset()) page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = self.get_serializer(queryset, many=True) # return Response(serializer.data) return simple_response(data=serializer.data, code=response_code.SUCCESS[0], message="ok.")
def update(self, request, *args, **kwargs): # partial = kwargs.pop('partial', False) partial = True instance = self.get_object() serializer = self.get_serializer(instance, data=request.data, partial=partial) serializer.is_valid(raise_exception=True) self.perform_update(serializer) if getattr(instance, '_prefetched_objects_cache', None): # If 'prefetch_related' has been applied to a queryset, we need to # forcibly invalidate the prefetch cache on the instance. instance._prefetched_objects_cache = {} # return Response(serializer.data) return simple_response(data=serializer.data, code=response_code.SUCCESS[0], message="updated.")
def destroy(self, request, *args, **kwargs): instance = self.get_object() self.perform_destroy(instance) # return Response(status=status.HTTP_204_NO_CONTENT) return simple_response(code=response_code.SUCCESS[0], message="deleted.")