Exemple #1
0
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
Exemple #2
0
 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.")
Exemple #3
0
 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.")
Exemple #4
0
    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.")
Exemple #5
0
    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.")
Exemple #6
0
 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.")