Как вернуть данные с ошибкой 403 в Django Rest Framework?

когда запрос GET переходит на сервер API в /obj/1

Я проверяю пользовательский класс разрешений, чтобы узнать, имеет ли пользователь доступ, если нет, 403 отправляется обратно.

однако я хотел бы прикрепить идентификатор объекта, чтобы пользователь мог нажать кнопку на интерфейсе, чтобы запросить доступ.

моя текущая реализация должна переопределить retrieve метод и" вручную " проверьте разрешение там.

упрощенный Разрешения

class CustomPerm(...):
    def has_object_permission(...):
        return request.user.is_staff

Viewset

class CustomViewSet(...):
    model = Model
    permission_classes = (CustomPerm, )

    def retrieve(self, request, pk=None):
        obj = get_object_or_404(Model, pk=pk)

        has_perm = CustomPerm().has_object_permission(request, self, obj=obj)
        if not has_perm:
            data = { 'id': obj.id }
            return Response(data, status=403)

        return super(ModelViewSet, self).retrieve(request, pk=pk)

Итак, мой текущий метод, has_perm возвращает набор запросов пользователей вместо логического значения, определенного в методе разрешений. Почему?

есть ли более чистый подход к этому?

1 ответов


from rest_framework import permissions
from rest_framework.exceptions import PermissionDenied

class CustomPerm(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.user.is_staff:
            return True
        raise PermissionDenied({"message":"You don't have permission to access",
                                "object_id": obj.id})

и вам не нужно переопределять извлечь метод

class CustomViewSet(...):
    model = Model
    permission_classes = (CustomPerm, )